emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

get-internal-run-time


From: Lars Brinkhoff
Subject: get-internal-run-time
Date: 01 May 2004 09:01:16 +0200
User-agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7

Richard Stallman <address@hidden> writes:
> [Lars Brinkhoff wrote:]
>     [I wish there were a] function that returns the amount of
>     processor time used [by Emacs], for implementing [the Common
>     Lisp function] get-internal-run-time.
> 
>     ANSI CL says:
>           The intent is that the difference between the values of
>           two calls to this function be the amount of time between
>           the two calls during which computational effort was
>           expended on behalf of the executing program.
>     I haven't found a suitable function for this in Emacs.
> 
> Would you like to contribute such a function?

Here's a first attempt, submitted for comment.


2004-05-01  Lars Brinkhoff  <address@hidden>

        * editfns.c (Fget_internal_run_time): New function.
        (syms_of_data): Defsubr it.

Index: editfns.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/editfns.c,v
retrieving revision 1.372
diff -c -r1.372 editfns.c
*** editfns.c   27 Apr 2004 13:28:38 -0000      1.372
--- editfns.c   1 May 2004 06:57:46 -0000
***************
*** 39,44 ****
--- 39,48 ----
  #include <stdio.h>
  #endif
  
+ #ifdef 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_SYS_RESOURCE_H
+   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
***************
*** 4280,4285 ****
--- 4325,4331 ----
    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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]