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"))
|