New function get-internal-run-time?
Lars Brinkhoff <[email protected]> Tue, 20 Sep 2005 20:34:29 +0200
| Newsgroups | gmane.emacs.xemacs.design |
|---|---|
| Organization | nocrew |
| Message-ID | <[email protected]> |
Hello, The patch below was accepted by another Emacs implementation. Would you be interested in an adapted version for XEmacs? etc/NEWS (Lisp Changes): ** The new primitive `get-internal-run-time' returns the processor run time used by Emacs since start-up. ./ChangeLog: 2004-10-28 Lars Brinkhoff <[email protected]> * configure.in: Add check for getrusage. src/ChangeLog: 2004-10-28 Lars Brinkhoff <[email protected]> * editfns.c (Fget_internal_run_time): New function. (syms_of_data): Defsubr it. lispref/ChangeLog: 2004-10-28 Lars Brinkhoff <[email protected]> * os.texi (Processor Run Time): New section documenting get-internal-run-time. Index: configure.in =================================================================== RCS file: /cvsroot/emacs/emacs/configure.in,v retrieving revision 1.375 diff -c -r1.375 configure.in *** configure.in 20 Oct 2004 16:16:07 -0000 1.375 --- configure.in 28 Oct 2004 16:09:55 -0000 *************** *** 2353,2359 **** AC_CHECK_HEADERS(maillock.h) AC_CHECK_FUNCS(gethostname getdomainname dup2 \ ! rename closedir mkdir rmdir sysinfo \ random lrand48 bcopy bcmp logb frexp fmod rint cbrt ftime res_init setsid \ strerror fpathconf select mktime euidaccess getpagesize tzset setlocale \ utimes setrlimit setpgid getcwd getwd shutdown getaddrinfo \ --- 2353,2359 ---- AC_CHECK_HEADERS(maillock.h) AC_CHECK_FUNCS(gethostname getdomainname dup2 \ ! rename closedir mkdir rmdir sysinfo getrusage \ random lrand48 bcopy bcmp logb frexp fmod rint cbrt ftime res_init setsid \ strerror fpathconf select mktime euidaccess getpagesize tzset setlocale \ utimes setrlimit setpgid getcwd getwd shutdown getaddrinfo \ Index: lispref/os.texi =================================================================== RCS file: /cvsroot/emacs/emacs/lispref/os.texi,v retrieving revision 1.65 diff -c -r1.65 os.texi *** lispref/os.texi 8 Aug 2004 00:00:07 -0000 1.65 --- lispref/os.texi 28 Oct 2004 16:10:04 -0000 *************** *** 23,28 **** --- 23,29 ---- * Time of Day:: Getting the current time. * Time Conversion:: Converting a time from numeric form to a string, or to calendrical data (or vice versa). + * Processor Run Time:: Getting the run time used by Emacs. * Time Calculations:: Adding, subtracting, comparing times, etc. * Timers:: Setting a timer to call a function at a certain time. * Terminal Input:: Recording terminal input for debugging. *************** *** 1285,1290 **** --- 1286,1313 ---- on others, years as early as 1901 do work. @end defun + @node Processor Run Time + @section Processor Run time + + @defun get-internal-run-time + This function returns the processor run time used by Emacs as a list + of three integers: @code{(@var{high} @var{low} @var{microsec})}. The + integers @var{high} and @var{low} combine to give the number of + seconds, which is + @ifnottex + @var{high} * 2**16 + @var{low}. + @end ifnottex + @tex + $high*2^{16}+low$. + @end tex + + The third element, @var{microsec}, gives the microseconds (or 0 for + systems that return time with the resolution of only one second). + + If the system doesn't provide a way to determine the processor run + time, get-internal-run-time returns the same time as current-time. + @end defun + @node Time Calculations @section Time Calculations Index: src/config.in =================================================================== RCS file: /cvsroot/emacs/emacs/src/config.in,v retrieving revision 1.200 diff -c -r1.200 config.in *** src/config.in 20 Oct 2004 16:23:30 -0000 1.200 --- src/config.in 28 Oct 2004 16:10:04 -0000 *************** *** 196,201 **** --- 196,204 ---- /* Define to 1 if you have the `getpt' function. */ #undef HAVE_GETPT + /* Define to 1 if you have the `getrusage' function. */ + #undef HAVE_GETRUSAGE + /* Define to 1 if you have the `getsockname' function. */ #undef HAVE_GETSOCKNAME Index: src/editfns.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/editfns.c,v retrieving revision 1.382 diff -c -r1.382 editfns.c *** src/editfns.c 27 Oct 2004 11:02:06 -0000 1.382 --- src/editfns.c 28 Oct 2004 16:10:06 -0000 *************** *** 39,44 **** --- 39,48 ---- #include <stdio.h> #endif + #if defined HAVE_SYS_RESOURCE_H + #include <sys/resource.h> + #endif + #include <ctype.h> #include "lisp.h" *************** *** 1375,1380 **** --- 1379,1425 ---- return Flist (3, result); } + + DEFUN ("get-internal-run-time", Fget_internal_run_time, Sget_internal_run_time, + 0, 0, 0, + doc: /* Return the current run time used by Emacs. + The time is returned as a list of three integers. The first has the + most significant 16 bits of the seconds, while the second has the + least significant 16 bits. The third integer gives the microsecond + count. + + On systems that can't determine the run time, get-internal-run-time + does the same thing as current-time. The microsecond count is zero on + systems that do not provide resolution finer than a second. */) + () + { + #ifdef HAVE_GETRUSAGE + struct rusage usage; + Lisp_Object result[3]; + int secs, usecs; + + if (getrusage (RUSAGE_SELF, &usage) < 0) + /* This shouldn't happen. What action is appropriate? */ + Fsignal (Qerror, Qnil); + + /* Sum up user time and system time. */ + secs = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec; + usecs = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec; + if (usecs >= 1000000) + { + usecs -= 1000000; + secs++; + } + + XSETINT (result[0], (secs >> 16) & 0xffff); + XSETINT (result[1], (secs >> 0) & 0xffff); + XSETINT (result[2], usecs); + + return Flist (3, result); + #else + return Fcurrent_time (); + #endif + } int *************** *** 4315,4320 **** --- 4360,4366 ---- defsubr (&Suser_full_name); defsubr (&Semacs_pid); defsubr (&Scurrent_time); + defsubr (&Sget_internal_run_time); defsubr (&Sformat_time_string); defsubr (&Sfloat_time); defsubr (&Sdecode_time);