# HG changeset patch # User Eli Zaretskii # Date 1099760437 0 # Node ID db8c9a3a77cd5d301afde1a1bfcdb2470b4af44e # Parent febe33245a3c90997fe724a2847f4d3ed8d456d7 (Fget_internal_run_time): New function. (syms_of_data): Defsubr it. diff -r febe33245a3c -r db8c9a3a77cd src/editfns.c --- a/src/editfns.c Sat Nov 06 16:54:06 2004 +0000 +++ b/src/editfns.c Sat Nov 06 17:00:37 2004 +0000 @@ -39,6 +39,10 @@ #include #endif +#if defined HAVE_SYS_RESOURCE_H +#include +#endif + #include #include "lisp.h" @@ -1375,6 +1379,47 @@ 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,6 +4360,7 @@ 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);