1994-02-07 01:05:54 +00:00
|
|
|
|
/* profile.c --- generate periodic events for profiling of Emacs Lisp code.
|
2014-01-01 07:43:34 +00:00
|
|
|
|
Copyright (C) 1992, 1994, 1999, 2001-2014 Free Software Foundation,
|
2013-01-01 09:11:05 +00:00
|
|
|
|
Inc.
|
1994-02-07 01:05:54 +00:00
|
|
|
|
|
2008-05-09 23:19:13 +00:00
|
|
|
|
Author: Boaz Ben-Zvi <boaz@lcs.mit.edu>
|
1994-02-07 01:05:54 +00:00
|
|
|
|
|
1996-01-15 09:18:04 +00:00
|
|
|
|
This file is part of GNU Emacs.
|
|
|
|
|
|
2008-05-09 23:19:13 +00:00
|
|
|
|
GNU Emacs is free software: you can redistribute it and/or modify
|
1996-01-15 09:18:04 +00:00
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2008-05-09 23:19:13 +00:00
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
(at your option) any later version.
|
1996-01-15 09:18:04 +00:00
|
|
|
|
|
|
|
|
|
GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
2008-05-09 23:19:13 +00:00
|
|
|
|
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
1994-02-07 01:05:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
Adapt the MS-DOS build to the latest changes.
msdos/mainmake.v2 (bootstrap-clean): Do a maintainer-clean in lib, not
bootstrap-clean (which doesn't exist).
msdos/inttypes.h (PRIuMAX) [__DJGPP__ < 2.04]: Define to "llu".
msdos/sedleim.inp (MKDIR_P): Edit to DOS "md" command.
msdos/sed1v2.inp: (LIB_CLOCK_GETTIME): Edit to empty.
Remove lines that invoke PAXCTL.
(clean): Fix recipe not to run Unixy shell commands.
msdos/sed2v2.inp (GETTIMEOFDAY_TIMEZONE): Edit to 'struct timezone'.
(HAVE_STRNCASECMP): Edit to 1.
msdos/sed3v2.inp (LIB_CLOCK_GETTIME): Edit to empty.
(C_SWITCH_SYSTEM): Add "-I../msdos".
msdos/sedlibmk.inp (GNULIB_GETTIMEOFDAY, GNULIB_PSELECT)
(GNULIB_SELECT, HAVE_STRUCT_TIMEVAL, HAVE_SYS_SELECT_H)
(HAVE_SYS_TIME_H, NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H)
(NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H, NEXT_SYS_SELECT_H)
(NEXT_SYS_TIME_H, REPLACE_GETTIMEOFDAY, REPLACE_PSELECT)
(REPLACE_STRUCT_TIMEVAL): Edit to appropriate values.
(BUILT_SOURCES): Edit out sys/select.h and sys/time.h.
(mostlyclean-local, distclean-generic): Fix recipe not to run
Unixy shell commands.
src/sysselect.h [DOS_NT]: Don't include sys/select.h.
src/s/ms-w32.h (select, pselect): Don't define here, they are
defined in sysselect.h
src/sysselect.h (pselect) [!HAVE_PSELECT]: Redirect to sys_select.
src/sysdep.c: Don't include dos.h and dosfns.h.
src/process.c (sys_select):
src/msdos.c (sys_select): Accept one more argument and ignore it.
src/msdos.c (event_timestamp, sys_select): Use gnulib's gettime;
adapt data types and code to that.
src/dosfns.c:
src/msdos.c (gettime, settime): Define away the prototypes in dos.h,
which clashes with the gnulib function of the same name.
lisp/emacs-lisp/timer.el (timer-until): Subtract results of
float-time, instead of taking float-time of the result of
time-subtract, since float-time signals an error for negative time
arguments.
2012-06-30 15:32:51 +00:00
|
|
|
|
** To be run as an emacs subprocess. Input string that starts with:
|
1994-02-07 01:05:54 +00:00
|
|
|
|
** 'z' -- resets the watch (to zero).
|
|
|
|
|
** 'p' -- return time (on stdout) as string with format <sec>.<micro-sec>
|
|
|
|
|
** 'q' -- exit.
|
|
|
|
|
**
|
|
|
|
|
** abstraction : a stopwatch
|
|
|
|
|
** operations: reset_watch, get_time
|
|
|
|
|
*/
|
2012-06-22 21:17:42 +00:00
|
|
|
|
|
A simpler, centralized INLINE.
* lib-src/profile.c (INLINE): New macro.
(SYSTIME_INLINE): Remove.
* src/conf_post.h (INLINE): Define only if not already defined.
This allows us to use a single INLINE, defined by one file
per executable.
* src/emacs.c (INLINE): Define it.
Also, include category.h, charset.h, composite.h, dispextern.h,
syntax.h, systime.h, so that their INLINE definitions are expanded
properly for Emacs.
* src/blockinput.h, src/keyboard.c (BLOCKINPUT_INLINE):
* src/buffer.h, src/buffer.c (BUFFER_INLINE):
* src/category.h, src/category.c (CATEGORY_INLINE):
* src/character.h, src/character.c (CHARACTER_INLINE):
* src/charset.h, src/charset.c (CHARSET_INLINE):
* src/composite.h, src/composite.c (COMPOSITE_INLINE):
* src/dispextern.h, src/dispnew.c (DISPEXTERN_INLINE):
* src/frame.h, src/frame.c (FRAME_INLINE):
* src/intervals.h, src/intervals.c (INTERVALS_INLINE):
* src/keyboard.h, src/keyboard.c (KEYBOARD_INLINE):
* src/lisp.h, src/alloc.c (LISP_INLINE):
* src/process.h, src/process.c (PROCESS_INLINE):
* src/syntax.h, src/syntax.c (SYNTAX_INLINE):
* src/systime.h, src/sysdep.c (SYSTIME_INLINE):
* src/termhooks.h, src/terminal.h (TERMHOOKS_INLINE):
* src/window.h, src/window.c (WINDOW_INLINE):
Remove. All uses replaced with INLINE.
2013-09-20 15:34:36 +00:00
|
|
|
|
#define INLINE EXTERN_INLINE
|
|
|
|
|
#include <config.h>
|
Use C99-style 'extern inline' if available.
* lib-src/profile.c (SYSTIME_INLINE): Define.
* nt/config.nt: Sync with autogen/config.in.
(_GL_INLINE, _GL_EXTERN_INLINE, _GL_INLINE_HEADER_BEGIN)
(_GL_INLINE_HEADER_END): New macros.
* src/buffer.h (BUFFER_INLINE):
* src/category.h (CATEGORY_INLINE):
* src/character.h (CHARACTER_INLINE):
* src/charset.h (CHARSET_INLINE):
* src/composite.h (COMPOSITE_INLINE):
* src/dispextern.h (DISPEXTERN_INLINE):
* src/lisp.h (LISP_INLINE):
* src/systime.h (SYSTIME_INLINE):
New macro, replacing 'static inline' in this header.
* src/buffer.h, src/category.h, src/character.h, src/charset.h:
* src/composite.h, src/dispextern.h, lisp.h, systime.h:
Use INLINE_HEADER_BEGIN, INLINE_HEADER_END.
* src/alloc.c (LISP_INLINE):
* src/buffer.c (BUFFER_INLINE):
* src/category.c (CATEGORY_INLINE):
* src/character.c (CHARACTER_INLINE):
* src/charset.c (CHARSET_INLINE):
* src/composite.c (COMPOSITE_INLINE):
* src/dispnew.c (DISPEXTERN_INLINE):
* src/sysdep.c (SYSTIME_INLINE):
Define to EXTERN_INLINE, so that the corresponding functions
are compiled into code.
* src/conf_post.h (INLINE, EXTERN_INLINE, INLINE_HEADER_BEGIN)
(INLINE_HEADER_END): New macros.
* src/lisp.h (PSEUDOVECTOR_FLAG): Now a macro as well as a constant,
since it's used in non-static inline functions now.
2012-08-02 07:31:34 +00:00
|
|
|
|
|
2012-06-22 21:17:42 +00:00
|
|
|
|
#include <inttypes.h>
|
Add support for large files. Merge glibc 2.1.2.
* b2m.c, emacsclient.c, emacsserver.c, fakemail.c, make-docfile.c,
movemail.c, pop.c:
Do not include <stdlib.h>, as <config.h> does this now.
* b2m.c, emacsserver.c, etags.c, profile.c:
Include <config.h> before any system include files.
* emacsclient.c, emacsserver.c, fakemail.c, movemail.c, pop.c,
test-distrib.c:
(read, write, open, close): Do not undef.
* getopt.c, getopt1.c: Adopt glibc 2.1.2, with the following fix:
(const): Do not define if HAVE_CONFIG_H; that's config.h's job.
* getopt.h: Adopt glibc 2.1.2.
1999-10-19 07:17:20 +00:00
|
|
|
|
#include <stdio.h>
|
2012-06-22 21:17:42 +00:00
|
|
|
|
|
|
|
|
|
#include <intprops.h>
|
2001-10-08 04:52:12 +00:00
|
|
|
|
#include <systime.h>
|
1994-02-07 01:05:54 +00:00
|
|
|
|
|
2013-08-27 18:47:55 +00:00
|
|
|
|
static struct timespec TV1;
|
1994-02-07 01:05:54 +00:00
|
|
|
|
static int watch_not_started = 1; /* flag */
|
2012-06-22 21:17:42 +00:00
|
|
|
|
static char time_string[INT_STRLEN_BOUND (uintmax_t) + sizeof "."
|
2013-08-27 18:47:55 +00:00
|
|
|
|
+ LOG10_TIMESPEC_RESOLUTION];
|
1994-02-07 01:05:54 +00:00
|
|
|
|
|
|
|
|
|
/* Reset the stopwatch to zero. */
|
|
|
|
|
|
2011-02-21 18:06:25 +00:00
|
|
|
|
static void
|
2010-07-03 00:50:23 +00:00
|
|
|
|
reset_watch (void)
|
1994-02-07 01:05:54 +00:00
|
|
|
|
{
|
2013-08-27 18:47:55 +00:00
|
|
|
|
TV1 = current_timespec ();
|
1994-02-07 01:05:54 +00:00
|
|
|
|
watch_not_started = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This call returns the time since the last reset_watch call. The time
|
2012-06-22 21:17:42 +00:00
|
|
|
|
is returned as a string with the format <seconds>.<nanoseconds>
|
1994-02-23 17:43:05 +00:00
|
|
|
|
If reset_watch was not called yet, exit. */
|
1994-02-07 01:05:54 +00:00
|
|
|
|
|
2011-02-21 18:06:25 +00:00
|
|
|
|
static char *
|
2010-07-03 00:50:23 +00:00
|
|
|
|
get_time (void)
|
1994-02-07 01:05:54 +00:00
|
|
|
|
{
|
2013-08-27 18:47:55 +00:00
|
|
|
|
struct timespec TV2 = timespec_sub (current_timespec (), TV1);
|
|
|
|
|
uintmax_t s = TV2.tv_sec;
|
|
|
|
|
int ns = TV2.tv_nsec;
|
1994-02-07 01:05:54 +00:00
|
|
|
|
if (watch_not_started)
|
2004-05-08 15:26:33 +00:00
|
|
|
|
exit (EXIT_FAILURE); /* call reset_watch first ! */
|
2013-08-27 18:47:55 +00:00
|
|
|
|
sprintf (time_string, "%"PRIuMAX".%0*d", s, LOG10_TIMESPEC_RESOLUTION, ns);
|
1994-02-07 01:05:54 +00:00
|
|
|
|
return time_string;
|
|
|
|
|
}
|
1995-07-30 07:07:39 +00:00
|
|
|
|
|
1996-07-15 21:27:49 +00:00
|
|
|
|
int
|
2010-07-03 00:50:23 +00:00
|
|
|
|
main (void)
|
1994-02-07 01:05:54 +00:00
|
|
|
|
{
|
1994-02-23 17:43:05 +00:00
|
|
|
|
int c;
|
|
|
|
|
while ((c = getchar ()) != EOF)
|
1994-02-07 01:05:54 +00:00
|
|
|
|
{
|
1994-02-23 17:43:05 +00:00
|
|
|
|
switch (c)
|
1994-02-07 01:05:54 +00:00
|
|
|
|
{
|
|
|
|
|
case 'z':
|
|
|
|
|
reset_watch ();
|
|
|
|
|
break;
|
|
|
|
|
case 'p':
|
|
|
|
|
puts (get_time ());
|
|
|
|
|
break;
|
|
|
|
|
case 'q':
|
2004-05-08 15:26:33 +00:00
|
|
|
|
exit (EXIT_SUCCESS);
|
1994-02-07 01:05:54 +00:00
|
|
|
|
}
|
1994-02-23 17:43:05 +00:00
|
|
|
|
/* Anything remaining on the line is ignored. */
|
|
|
|
|
while (c != '\n' && c != EOF)
|
|
|
|
|
c = getchar ();
|
1994-02-07 01:05:54 +00:00
|
|
|
|
}
|
2004-05-08 15:26:33 +00:00
|
|
|
|
exit (EXIT_FAILURE);
|
1994-02-07 01:05:54 +00:00
|
|
|
|
}
|
2003-09-01 15:45:59 +00:00
|
|
|
|
|
2004-05-08 15:26:33 +00:00
|
|
|
|
|
|
|
|
|
/* profile.c ends here */
|