From 295bacba61bd681798b55599551116db197b3388 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 16 Sep 2018 21:24:04 -0700 Subject: [PATCH] Move current_timespec decl to timespec.h MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This change was motivated by the desire to remove the weird dependency of lib-src/profile.o on src/systime.h. profile.c included systime.h only for current_timespec, and this inclusion required systime.h to have #ifdef emacs in multiple places and complicated further changes I have in mind. The current_timespec decl belongs in timespec.h anyway, and the main effect of this change is to move it there. * lib-src/profile.c (INLINE): Remove. Include timespec.h, not systime.h. * lib/gettime.c (gettime): Prefer clock_gettime to nanotime, and don’t worry about it failing on a CLOCK_REALTIME arg. POSIX requires it to succeed and I don’t know of any counterexamples where the fallbacks would work. (current_timespec): Move here from src/systime.h. Nowadays it seems to be better to not have this function be inline. * lib/timespec.h: Include arg-nonnull.h. (current_timespec): New declaration. (gettime, settime): Declare args to be nonnull. * lib/gettime.c, lib/timespec.h: Copy from Gnulib. * src/systime.h: Simplify by assuming ‘emacs’ is defined, which it always is now. (current_timespec): Move to lib/timespec.h. --- lib-src/profile.c | 3 +-- lib/gettime.c | 29 ++++++++++++++++------------- lib/timespec.h | 10 ++++++---- src/systime.h | 22 +++------------------- 4 files changed, 26 insertions(+), 38 deletions(-) diff --git a/lib-src/profile.c b/lib-src/profile.c index cccdfbc7c84..649eb04b374 100644 --- a/lib-src/profile.c +++ b/lib-src/profile.c @@ -30,14 +30,13 @@ along with GNU Emacs. If not, see . */ ** operations: reset_watch, get_time */ -#define INLINE EXTERN_INLINE #include #include #include #include -#include +#include #include static struct timespec TV1; diff --git a/lib/gettime.c b/lib/gettime.c index 9a4e342f18e..171f22476f8 100644 --- a/lib/gettime.c +++ b/lib/gettime.c @@ -28,21 +28,24 @@ void gettime (struct timespec *ts) { -#if HAVE_NANOTIME +#if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME + clock_gettime (CLOCK_REALTIME, ts); +#elif HAVE_NANOTIME nanotime (ts); #else + struct timeval tv; + gettimeofday (&tv, NULL); + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; +#endif +} -# if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME - if (clock_gettime (CLOCK_REALTIME, ts) == 0) - return; -# endif - - { - struct timeval tv; - gettimeofday (&tv, NULL); - ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000; - } +/* Return the current system time as a struct timespec. */ -#endif +struct timespec +current_timespec (void) +{ + struct timespec ts; + gettime (&ts); + return ts; } diff --git a/lib/timespec.h b/lib/timespec.h index c414cfe45ee..cc49668f42a 100644 --- a/lib/timespec.h +++ b/lib/timespec.h @@ -17,9 +17,9 @@ along with this program. If not, see . */ #if ! defined TIMESPEC_H -# define TIMESPEC_H +#define TIMESPEC_H -# include +#include #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." @@ -33,6 +33,7 @@ _GL_INLINE_HEADER_BEGIN extern "C" { #endif +#include "arg-nonnull.h" #include "verify.h" /* Inverse resolution of timespec timestamps (in units per second), @@ -122,8 +123,9 @@ timespectod (struct timespec a) return a.tv_sec + a.tv_nsec / 1e9; } -void gettime (struct timespec *); -int settime (struct timespec const *); +struct timespec current_timespec (void); +void gettime (struct timespec *) _GL_ARG_NONNULL ((1)); +int settime (struct timespec const *) _GL_ARG_NONNULL ((1)); #ifdef __cplusplus } diff --git a/src/systime.h b/src/systime.h index ede3d4eb12d..ad5ab857308 100644 --- a/src/systime.h +++ b/src/systime.h @@ -23,12 +23,10 @@ along with GNU Emacs. If not, see . */ INLINE_HEADER_BEGIN -#ifdef emacs -# ifdef HAVE_X_WINDOWS -# include -# else +#ifdef HAVE_X_WINDOWS +# include +#else typedef unsigned long Time; -# endif #endif /* On some configurations (hpux8.0, X11R4), sys/time.h and X11/Xos.h @@ -66,15 +64,6 @@ timespec_valid_p (struct timespec t) return t.tv_nsec >= 0; } -/* Return current system time. */ -INLINE struct timespec -current_timespec (void) -{ - struct timespec r; - gettime (&r); - return r; -} - /* defined in sysdep.c */ extern int set_file_times (int, const char *, struct timespec, struct timespec); extern struct timeval make_timeval (struct timespec) ATTRIBUTE_CONST; @@ -82,10 +71,6 @@ extern struct timeval make_timeval (struct timespec) ATTRIBUTE_CONST; /* defined in keyboard.c */ extern void set_waiting_for_input (struct timespec *); -/* When lisp.h is not included Lisp_Object is not defined (this can - happen when this file is used outside the src directory). */ -#ifdef emacs - /* Emacs uses the integer list (HI LO US PS) to represent the time (HI << LO_TIME_BITS) + LO + US / 1e6 + PS / 1e12. */ enum { LO_TIME_BITS = 16 }; @@ -103,7 +88,6 @@ extern int decode_time_components (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, struct lisp_time *, double *); extern struct timespec lisp_to_timespec (struct lisp_time); extern struct timespec lisp_time_argument (Lisp_Object); -#endif INLINE_HEADER_END -- 2.39.2