Raymond Toy pushed to branch issue-180-get-page-size-in-c at cmucl / cmucl
Commits:
-
bbfff3c0
by Raymond Toy at 2023-04-10T15:11:59+00:00
-
5196072a
by Raymond Toy at 2023-04-10T15:12:01+00:00
-
b2aee0f7
by Raymond Toy at 2023-04-17T08:14:29-07:00
-
fbb742ae
by Raymond Toy at 2023-04-19T14:14:39+00:00
-
501ca837
by Raymond Toy at 2023-04-19T14:14:40+00:00
-
2556df76
by Raymond Toy at 2023-04-19T07:38:34-07:00
-
dc1654d6
by Raymond Toy at 2023-04-19T08:32:04-07:00
-
0dc0b228
by Raymond Toy at 2023-04-19T09:51:28-07:00
10 changed files:
- src/code/bsd-os.lisp
- src/code/linux-os.lisp
- src/code/misc.lisp
- + src/code/os.lisp
- src/code/sunos-os.lisp
- src/code/unix.lisp
- src/general-info/release-21e.md
- src/lisp/os-common.c
- src/tools/worldbuild.lisp
- src/tools/worldcom.lisp
Changes:
| ... | ... | @@ -48,19 +48,6 @@ |
| 48 | 48 | #+Darwin "Darwin"
|
| 49 | 49 | #-(or freebsd NetBSD OpenBSD Darwin) "BSD")
|
| 50 | 50 | |
| 51 | -(defvar *software-version* nil "Version string for supporting software")
|
|
| 52 | - |
|
| 53 | -(defun software-version ()
|
|
| 54 | - "Returns a string describing version of the supporting software."
|
|
| 55 | - (unless *software-version*
|
|
| 56 | - (setf *software-version*
|
|
| 57 | - (string-trim '(#\newline)
|
|
| 58 | - (with-output-to-string (stream)
|
|
| 59 | - (run-program "/usr/bin/uname"
|
|
| 60 | - '("-r")
|
|
| 61 | - :output stream)))))
|
|
| 62 | - *software-version*)
|
|
| 63 | - |
|
| 64 | 51 | |
| 65 | 52 | ;;; OS-Init initializes our operating-system interface. It sets the values
|
| 66 | 53 | ;;; of the global port variables to what they should be and calls the functions
|
| ... | ... | @@ -83,5 +70,3 @@ |
| 83 | 70 | (unix:get-unix-error-msg utime)))
|
| 84 | 71 |
|
| 85 | 72 | (values utime stime majflt))) |
| 86 | - |
|
| 87 | - |
| ... | ... | @@ -28,33 +28,20 @@ |
| 28 | 28 | |
| 29 | 29 | (setq *software-type* "Linux")
|
| 30 | 30 | |
| 31 | -;;; Instead of reading /proc/version (which has some bugs with
|
|
| 32 | -;;; select() in Linux kernel 2.6.x) and instead of running uname -r,
|
|
| 33 | -;;; let's just get the info from uname().
|
|
| 34 | -(defun software-version ()
|
|
| 35 | - "Returns a string describing version of the supporting software."
|
|
| 36 | - (multiple-value-bind (sysname nodename release version)
|
|
| 37 | - (unix:unix-uname)
|
|
| 38 | - (declare (ignore sysname nodename))
|
|
| 39 | - (concatenate 'string release " " version)))
|
|
| 40 | - |
|
| 41 | - |
|
| 42 | 31 | ;;; OS-Init initializes our operating-system interface.
|
| 43 | 32 | ;;;
|
| 44 | -(defun os-init () nil)
|
|
| 33 | +(defun os-init ()
|
|
| 34 | + (setf *software-version* nil))
|
|
| 35 | + |
|
| 45 | 36 | |
| 37 | +;;; GET-PAGE-SIZE -- Interface
|
|
| 38 | +;;;
|
|
| 39 | +;;; Return the system page size.
|
|
| 40 | +;;;
|
|
| 41 | +(defun get-page-size ()
|
|
| 42 | + (multiple-value-bind (val err)
|
|
| 43 | + (unix:unix-getpagesize)
|
|
| 44 | + (unless val
|
|
| 45 | + (error (intl:gettext "Getpagesize failed: ~A") (unix:get-unix-error-msg err)))
|
|
| 46 | + val))
|
|
| 46 | 47 | |
| 47 | -;;; GET-SYSTEM-INFO -- Interface
|
|
| 48 | -;;;
|
|
| 49 | -;;; Return system time, user time and number of page faults.
|
|
| 50 | -;;;
|
|
| 51 | -(defun get-system-info ()
|
|
| 52 | - (multiple-value-bind (err? utime stime maxrss ixrss idrss
|
|
| 53 | - isrss minflt majflt)
|
|
| 54 | - (unix:unix-getrusage unix:rusage_self)
|
|
| 55 | - (declare (ignore maxrss ixrss idrss isrss minflt))
|
|
| 56 | - (unless err?
|
|
| 57 | - (error (intl:gettext "Unix system call getrusage failed: ~A.")
|
|
| 58 | - (unix:get-unix-error-msg utime)))
|
|
| 59 | -
|
|
| 60 | - (values utime stime majflt))) |
| ... | ... | @@ -17,7 +17,7 @@ |
| 17 | 17 | (in-package "LISP")
|
| 18 | 18 | (intl:textdomain "cmucl")
|
| 19 | 19 | |
| 20 | -(export '(documentation *features* variable room
|
|
| 20 | +(export '(*features* variable room
|
|
| 21 | 21 | lisp-implementation-type lisp-implementation-version machine-type
|
| 22 | 22 | machine-version machine-instance software-type software-version
|
| 23 | 23 | short-site-name long-site-name dribble compiler-macro))
|
| ... | ... | @@ -81,12 +81,32 @@ |
| 81 | 81 | (unix:unix-gethostname))
|
| 82 | 82 | |
| 83 | 83 | (defvar *software-type* "Unix"
|
| 84 | - "The value of SOFTWARE-TYPE. Set in FOO-os.lisp.")
|
|
| 84 | + _N"The value of SOFTWARE-TYPE. Set in FOO-os.lisp.")
|
|
| 85 | 85 | |
| 86 | 86 | (defun software-type ()
|
| 87 | 87 | "Returns a string describing the supporting software."
|
| 88 | 88 | *software-type*)
|
| 89 | 89 | |
| 90 | +(defvar *software-version* nil
|
|
| 91 | + _N"Version string for supporting software")
|
|
| 92 | + |
|
| 93 | +(defun software-version ()
|
|
| 94 | + _N"Returns a string describing version of the supporting software."
|
|
| 95 | + (unless *software-version*
|
|
| 96 | + (setf *software-version*
|
|
| 97 | + (let (version result)
|
|
| 98 | + (unwind-protect
|
|
| 99 | + (progn
|
|
| 100 | + (setf version
|
|
| 101 | + (alien:alien-funcall
|
|
| 102 | + (alien:extern-alien "os_software_version"
|
|
| 103 | + (function (alien:* c-call:c-string)))))
|
|
| 104 | + (setf result (alien:cast version c-call:c-string))))
|
|
| 105 | + (if (zerop (length result))
|
|
| 106 | + "Unknown"
|
|
| 107 | + result)))
|
|
| 108 | + *software-version*))
|
|
| 109 | + |
|
| 90 | 110 | (defvar *short-site-name* nil
|
| 91 | 111 | "The value of SHORT-SITE-NAME. Set in library:site-init.lisp.")
|
| 92 | 112 |
| 1 | +;;; -*- Package: SYSTEM -*-
|
|
| 2 | +;;;
|
|
| 3 | +;;; **********************************************************************
|
|
| 4 | +;;; This code was written as part of the CMU Common Lisp project at
|
|
| 5 | +;;; and has been placed in the public domain.
|
|
| 6 | +;;;
|
|
| 7 | +(ext:file-comment
|
|
| 8 | + "$Header: src/code/os.lisp $")
|
|
| 9 | +;;;
|
|
| 10 | +;;; **********************************************************************
|
|
| 11 | +;;;
|
|
| 12 | +;;; OS interface functions for CMUCL.
|
|
| 13 | +;;;
|
|
| 14 | +;;; The code here is for OS functions that don't depend on the OS.
|
|
| 15 | + |
|
| 16 | +(in-package "SYSTEM")
|
|
| 17 | +(use-package "EXTENSIONS")
|
|
| 18 | +(intl:textdomain "cmucl-linux-os")
|
|
| 19 | + |
|
| 20 | +(export '(get-page-size))
|
|
| 21 | + |
|
| 22 | +;;; GET-PAGE-SIZE -- Interface
|
|
| 23 | +;;;
|
|
| 24 | +;;; Return the system page size.
|
|
| 25 | +;;;
|
|
| 26 | +(defun get-page-size ()
|
|
| 27 | + _N"Return the system page size"
|
|
| 28 | + (let ((maybe-page-size (alien:alien-funcall
|
|
| 29 | + (alien:extern-alien "os_get_page_size"
|
|
| 30 | + (function c-call:long)))))
|
|
| 31 | + (when (minusp maybe-page-size)
|
|
| 32 | + (error (intl:gettext "get-page-size failed: ~A") (get-unix-error-msg err)))
|
|
| 33 | + maybe-page-size))
|
|
| 34 | + |
|
| 35 | + |
| ... | ... | @@ -33,19 +33,6 @@ |
| 33 | 33 | |
| 34 | 34 | (setq *software-type* "SunOS")
|
| 35 | 35 | |
| 36 | -(defvar *software-version* nil "Version string for supporting software")
|
|
| 37 | - |
|
| 38 | -(defun software-version ()
|
|
| 39 | - "Returns a string describing version of the supporting software."
|
|
| 40 | - (unless *software-version*
|
|
| 41 | - (setf *software-version*
|
|
| 42 | - (multiple-value-bind (sysname nodename release version)
|
|
| 43 | - (unix:unix-uname)
|
|
| 44 | - (declare (ignore sysname nodename))
|
|
| 45 | - (concatenate 'string release " " version))))
|
|
| 46 | - *software-version*)
|
|
| 47 | - |
|
| 48 | - |
|
| 49 | 36 | ;;; OS-INIT -- interface.
|
| 50 | 37 | ;;;
|
| 51 | 38 | ;;; Other OS dependent initializations.
|
| ... | ... | @@ -2922,14 +2922,27 @@ |
| 2922 | 2922 | (function (* char))))
|
| 2923 | 2923 | c-string))
|
| 2924 | 2924 | |
| 2925 | -;;; GET-PAGE-SIZE -- Interface
|
|
| 2925 | +;;; GET-SYSTEM-INFO -- Interface
|
|
| 2926 | 2926 | ;;;
|
| 2927 | -;;; Return the system page size.
|
|
| 2927 | +;;; Return system time, user time (in usec) and number of page
|
|
| 2928 | +;;; faults.
|
|
| 2928 | 2929 | ;;;
|
| 2929 | -(defun get-page-size ()
|
|
| 2930 | - (let ((maybe-page-size (alien-funcall
|
|
| 2931 | - (extern-alien "os_get_page_size"
|
|
| 2932 | - (function c-call:long)))))
|
|
| 2933 | - (when (minusp maybe-page-size)
|
|
| 2934 | - (error (intl:gettext "get-page-size failed: ~A") (get-unix-error-msg err)))
|
|
| 2935 | - maybe-page-size)) |
|
| 2930 | +(defun get-system-info ()
|
|
| 2931 | + "Get system information consisting of the user time (in usec), the
|
|
| 2932 | + system time (in usec) and the number of major page faults."
|
|
| 2933 | + (with-alien ((utime int64-t 0)
|
|
| 2934 | + (stime int64-t 0)
|
|
| 2935 | + (major-fault c-call:long 0))
|
|
| 2936 | + (let ((rc (alien-funcall
|
|
| 2937 | + (extern-alien "os_get_system_info"
|
|
| 2938 | + (function c-call:int
|
|
| 2939 | + (* int64-t)
|
|
| 2940 | + (* int64-t)
|
|
| 2941 | + (* c-call:long)))
|
|
| 2942 | + (addr utime)
|
|
| 2943 | + (addr stime)
|
|
| 2944 | + (addr major-fault))))
|
|
| 2945 | + (when (minusp rc)
|
|
| 2946 | + (error (intl:gettext "Unix system call getrusage failed: ~A.")
|
|
| 2947 | + (unix:get-unix-error-msg utime)))
|
|
| 2948 | + (values utime stime major-fault)))) |
| ... | ... | @@ -49,10 +49,11 @@ public domain. |
| 49 | 49 | * ~~#108~~ Update ASDF.
|
| 50 | 50 | * ~~#112~~ CLX can't connect to X server via inet sockets.
|
| 51 | 51 | * ~~#113~~ REQUIRE on contribs can pull in the wrong things via ASDF.
|
| 52 | - * ~~#121~~ Wrong column index in FILL-POINTER-OUTPUT-STREAM.
|
|
| 53 | - * ~~#122~~ gcc 11 can't build cmucl.
|
|
| 54 | - * ~~#124~~ directory with `:wild-inferiors` doesn't descend subdirectories.
|
|
| 55 | - * ~~#125~~ Linux `unix-stat` returning incorrect values.
|
|
| 52 | + * ~~#120~~ `SOFTWARE-VERSION` is implemented in C.
|
|
| 53 | + * ~~#121~~ Wrong column index in FILL-POINTER-OUTPUT-STREAM
|
|
| 54 | + * ~~#122~~ gcc 11 can't build cmucl
|
|
| 55 | + * ~~#124~~ directory with `:wild-inferiors` doesn't descend subdirectories
|
|
| 56 | + * ~~#125~~ Linux `unix-stat` returning incorrect values
|
|
| 56 | 57 | * ~~#127~~ Linux unix-getpwuid segfaults when given non-existent uid.
|
| 57 | 58 | * ~~#128~~ `QUIT` accepts an exit code.
|
| 58 | 59 | * ~~#130~~ Move file-author to C.
|
| ... | ... | @@ -15,7 +15,9 @@ |
| 15 | 15 | #include <stdio.h>
|
| 16 | 16 | #include <stdlib.h>
|
| 17 | 17 | #include <string.h>
|
| 18 | +#include <sys/resource.h>
|
|
| 18 | 19 | #include <sys/stat.h>
|
| 20 | +#include <sys/utsname.h>
|
|
| 19 | 21 | #include <unistd.h>
|
| 20 | 22 | #include <time.h>
|
| 21 | 23 | |
| ... | ... | @@ -811,3 +813,53 @@ os_get_page_size(void) |
| 811 | 813 |
|
| 812 | 814 | return sysconf(_SC_PAGESIZE);
|
| 813 | 815 | }
|
| 816 | + |
|
| 817 | +/*
|
|
| 818 | + * Get system info consisting of the utime (in usec), the stime (in
|
|
| 819 | + * usec) and the number of major page faults. The return value is the
|
|
| 820 | + * return code from getrusage.
|
|
| 821 | + */
|
|
| 822 | +int
|
|
| 823 | +os_get_system_info(int64_t* utime, int64_t* stime, long* major_fault)
|
|
| 824 | +{
|
|
| 825 | + struct rusage usage;
|
|
| 826 | + int rc;
|
|
| 827 | + |
|
| 828 | + *utime = 0;
|
|
| 829 | + *stime = 0;
|
|
| 830 | + *major_fault = 0;
|
|
| 831 | +
|
|
| 832 | + rc = getrusage(RUSAGE_SELF, &usage);
|
|
| 833 | + if (rc == 0) {
|
|
| 834 | + *utime = usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec;
|
|
| 835 | + *stime = usage.ru_stime.tv_sec * 1000000 + usage.ru_stime.tv_usec;
|
|
| 836 | + *major_fault = usage.ru_majflt;
|
|
| 837 | + }
|
|
| 838 | + |
|
| 839 | + return rc;
|
|
| 840 | +}
|
|
| 841 | + |
|
| 842 | +/*
|
|
| 843 | + * Get the software version. This is the same as "uname -r", the release.
|
|
| 844 | + * A pointer to a static string is returned. If uname fails, an empty
|
|
| 845 | + * string is returned.
|
|
| 846 | + */
|
|
| 847 | +char*
|
|
| 848 | +os_software_version(void)
|
|
| 849 | +{
|
|
| 850 | + struct utsname uts;
|
|
| 851 | + int status;
|
|
| 852 | + |
|
| 853 | + /*
|
|
| 854 | + * Buffer large enough to hold the release.
|
|
| 855 | + */
|
|
| 856 | + static char result[sizeof(uts.release)];
|
|
| 857 | + result[0] = '\0';
|
|
| 858 | + |
|
| 859 | + status = uname(&uts);
|
|
| 860 | + if (status == 0) {
|
|
| 861 | + strcpy(result, uts.release);
|
|
| 862 | + }
|
|
| 863 | +
|
|
| 864 | + return result;
|
|
| 865 | +} |
| ... | ... | @@ -147,6 +147,7 @@ |
| 147 | 147 | '("target:code/bsd-os"))
|
| 148 | 148 | ,@(when (c:backend-featurep :Linux)
|
| 149 | 149 | '("target:code/linux-os"))
|
| 150 | + "target:code/os"
|
|
| 150 | 151 | "target:code/serve-event"
|
| 151 | 152 | "target:code/stream"
|
| 152 | 153 | "target:code/fd-stream"
|
| ... | ... | @@ -173,6 +173,7 @@ |
| 173 | 173 | (comf "target:code/bsd-os"))
|
| 174 | 174 | (when (c:backend-featurep :Linux)
|
| 175 | 175 | (comf "target:code/linux-os"))
|
| 176 | +(comf "target:code/os")
|
|
| 176 | 177 | |
| 177 | 178 | (when (c:backend-featurep :pmax)
|
| 178 | 179 | (comf "target:code/pmax-vm"))
|