root/trunk/lib-src/profile.c

Revision 4220, 2.7 kB (checked in by miyoshi, 5 months ago)

Sync up with Emacs22.2.

  • Property svn:eol-style set to native
Line 
1 /* profile.c --- generate periodic events for profiling of Emacs Lisp code.
2    Copyright (C) 1992, 1994, 1999, 2001, 2002, 2003, 2004,
3                  2005, 2006, 2007, 2008  Free Software Foundation, Inc.
4
5  Author: Boaz Ben-Zvi <boaz@lcs.mit.edu>
6
7 This file is part of GNU Emacs.
8
9 GNU Emacs is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GNU Emacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU Emacs; see the file COPYING.  If not, write to
21 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA.  */
23
24
25 /**
26  **  To be run as an emacs process. Input string that starts with:
27  **    'z' -- resets the watch (to zero).
28  **    'p' -- return time (on stdout) as string with format <sec>.<micro-sec>
29  **    'q' -- exit.
30  **
31  **  abstraction : a stopwatch
32  **  operations: reset_watch, get_time
33  */
34 #include <config.h>
35 #include <stdio.h>
36 #include <systime.h>
37
38 static EMACS_TIME TV1, TV2;
39 static int watch_not_started = 1; /* flag */
40 static char time_string[30];
41
42 /* Reset the stopwatch to zero.  */
43
44 void
45 reset_watch ()
46 {
47   EMACS_GET_TIME (TV1);
48   watch_not_started = 0;
49 }
50
51 /* This call returns the time since the last reset_watch call.  The time
52    is returned as a string with the format  <seconds>.<micro-seconds>
53    If reset_watch was not called yet, exit.  */
54
55 char *
56 get_time ()
57 {
58   if (watch_not_started)
59     exit (EXIT_FAILURE);  /* call reset_watch first ! */
60   EMACS_GET_TIME (TV2);
61   EMACS_SUB_TIME (TV2, TV2, TV1);
62   sprintf (time_string, "%lu.%06lu", (unsigned long)EMACS_SECS (TV2), (unsigned long)EMACS_USECS (TV2));
63   return time_string;
64 }
65
66 #if ! defined (HAVE_GETTIMEOFDAY) && defined (HAVE_TIMEVAL)
67
68 /* ARGSUSED */
69 gettimeofday (tp, tzp)
70      struct timeval *tp;
71      struct timezone *tzp;
72 {
73   extern long time ();
74
75   tp->tv_sec = time ((long *)0);
76   tp->tv_usec = 0;
77   if (tzp != 0)
78     tzp->tz_minuteswest = -1;
79 }
80
81 #endif
82
83 int
84 main ()
85 {
86   int c;
87   while ((c = getchar ()) != EOF)
88     {
89       switch (c)
90         {
91         case 'z':
92           reset_watch ();
93           break;
94         case 'p':
95           puts (get_time ());
96           break;
97         case 'q':
98           exit (EXIT_SUCCESS);
99         }
100       /* Anything remaining on the line is ignored.  */
101       while (c != '\n' && c != EOF)
102         c = getchar ();
103     }
104   exit (EXIT_FAILURE);
105 }
106
107 /* arch-tag: 8db68f7e-2322-4944-a315-dba349bdbf39
108    (do not change this comment) */
109
110 /* profile.c ends here */
Note: See TracBrowser for help on using the browser.