emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] trunk r114031: Simplify EMACS_TIME-related code.


From: Paul Eggert
Subject: [Emacs-diffs] trunk r114031: Simplify EMACS_TIME-related code.
Date: Tue, 27 Aug 2013 18:48:01 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 114031
revision-id: address@hidden
parent: address@hidden
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Tue 2013-08-27 11:47:55 -0700
message:
  Simplify EMACS_TIME-related code.
  
  This portability layer is no longer needed, since Emacs has been
  using struct timespec as a portability layer for some time.
  Merge from gnulib, incorporating:
  2013-08-27 timespec: new convenience constants and function
  * src/atimer.h, src/buffer.h, src/dispextern.h, src/xgselect.h:
  Include <time.h> rather than "systime.h"; that's all that's needed now.
  * src/dispnew.c: Include <timespec.h> rather than "systime.h";
  that's all that's needed now.
  * src/systime.h (EMACS_TIME): Remove.  All uses changed to struct timespec.
  (EMACS_TIME_RESOLUTION): Remove.  All uses changed to
  TIMESPEC_RESOLUTION.
  (LOG10_EMACS_TIME_RESOLUTION): Remove.  All uses changed to
  LOG10_TIMESPEC_RESOLUTION.
  (EMACS_SECS, emacs_secs_addr): Remove.  All uses changed to tv_sec.
  (EMACS_NSECS): Remove.  All uses changed to tv_nsec.
  (make_emacs_time): Remove.  All used changed to make_timespec.
  (invalid_timespec): Rename from invalid_emacs_time.  All uses changed.
  (current_timespec): Rename from current_emacs_time.  All uses changed.
  (add_emacs_time): Remove.  All uses changed to timespec_add.
  (sub_emacs_time): Remove.  All uses change dot timespec_sub.
  (EMACS_TIME_SIGN): Remove.  All uses changed to timespec_sign.
  (timespec_valid_p): Rename from EMACS_TIME_VALID_P.  All uses changed.
  (EMACS_TIME_FROM_DOUBLE): Remove.  All uses changed to dtotimespec.
  (EMACS_TIME_TO_DOUBLE): Remove.  All uses changed to timespectod.
  (current_timespec): Rename from current_emacs_time.  All uses changed.
  (EMACS_TIME_EQ, EMACS_TIME_LT, EMACS_TIME_LE): Remove.  All uses
  changed to timespec_cmp.
  * src/xgselect.c: Include <timespec.h>, since our .h files don't.
modified:
  ChangeLog                      changelog-20091113204419-o5vbwnq5f7feedwu-1538
  lib-src/profile.c              profile.c-20091113204419-o5vbwnq5f7feedwu-685
  lib/timespec.h                 timespec.h-20120622212453-poe1wduuhk4mz8vy-10
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/alloc.c                    alloc.c-20091113204419-o5vbwnq5f7feedwu-252
  src/atimer.c                   atimer.c-20091113204419-o5vbwnq5f7feedwu-1759
  src/atimer.h                   atimer.h-20091113204419-o5vbwnq5f7feedwu-1760
  src/buffer.c                   buffer.c-20091113204419-o5vbwnq5f7feedwu-264
  src/buffer.h                   buffer.h-20091113204419-o5vbwnq5f7feedwu-196
  src/dispextern.h               
dispextern.h-20091113204419-o5vbwnq5f7feedwu-218
  src/dispnew.c                  dispnew.c-20091113204419-o5vbwnq5f7feedwu-258
  src/editfns.c                  editfns.c-20091113204419-o5vbwnq5f7feedwu-255
  src/fileio.c                   fileio.c-20091113204419-o5vbwnq5f7feedwu-210
  src/gtkutil.c                  gtkutil.c-20091113204419-o5vbwnq5f7feedwu-2527
  src/image.c                    image.c-20091113204419-o5vbwnq5f7feedwu-2969
  src/keyboard.c                 keyboard.c-20091113204419-o5vbwnq5f7feedwu-449
  src/keyboard.h                 keyboard.h-20091113204419-o5vbwnq5f7feedwu-450
  src/lread.c                    lread.c-20091113204419-o5vbwnq5f7feedwu-266
  src/msdos.c                    msdos.c-20091113204419-o5vbwnq5f7feedwu-656
  src/nsmenu.m                   nsmenu.m-20091113204419-o5vbwnq5f7feedwu-8744
  src/nsterm.h                   nsterm.h-20091113204419-o5vbwnq5f7feedwu-8746
  src/nsterm.m                   nsterm.m-20091113204419-o5vbwnq5f7feedwu-8747
  src/process.c                  process.c-20091113204419-o5vbwnq5f7feedwu-462
  src/profiler.c                 profiler.c-20120822062536-8tk8gghazaoi1nyq-2
  src/sysdep.c                   sysdep.c-20091113204419-o5vbwnq5f7feedwu-448
  src/systime.h                  systime.h-20091113204419-o5vbwnq5f7feedwu-510
  src/w32.c                      w32.c-20091113204419-o5vbwnq5f7feedwu-808
  src/w32proc.c                  w32proc.c-20091113204419-o5vbwnq5f7feedwu-814
  src/xdisp.c                    xdisp.c-20091113204419-o5vbwnq5f7feedwu-240
  src/xgselect.c                 xgselect.c-20091121171556-bypaf8oo9ygoo13w-2
  src/xgselect.h                 xgselect.h-20091121171556-bypaf8oo9ygoo13w-3
  src/xmenu.c                    xmenu.c-20091113204419-o5vbwnq5f7feedwu-161
  src/xterm.c                    xterm.c-20091113204419-o5vbwnq5f7feedwu-244
=== modified file 'ChangeLog'
--- a/ChangeLog 2013-08-27 09:21:46 +0000
+++ b/ChangeLog 2013-08-27 18:47:55 +0000
@@ -1,3 +1,9 @@
+2013-08-27  Paul Eggert  <address@hidden>
+
+       Simplify EMACS_TIME-related code.
+       Merge from gnulib, incorporating:
+       2013-08-27 timespec: new convenience constants and function
+
 2013-08-27  Dmitry Antipov  <address@hidden>
 
        * configure.ac (DOCMISC_DVI_W32, DOCMISC_HTML_W32, DOCMISC_INFO_W32)

=== modified file 'lib-src/profile.c'
--- a/lib-src/profile.c 2013-01-01 09:11:05 +0000
+++ b/lib-src/profile.c 2013-08-27 18:47:55 +0000
@@ -39,17 +39,17 @@
 #include <intprops.h>
 #include <systime.h>
 
-static EMACS_TIME TV1;
+static struct timespec TV1;
 static int watch_not_started = 1; /* flag */
 static char time_string[INT_STRLEN_BOUND (uintmax_t) + sizeof "."
-                       + LOG10_EMACS_TIME_RESOLUTION];
+                       + LOG10_TIMESPEC_RESOLUTION];
 
 /* Reset the stopwatch to zero.  */
 
 static void
 reset_watch (void)
 {
-  TV1 = current_emacs_time ();
+  TV1 = current_timespec ();
   watch_not_started = 0;
 }
 
@@ -60,12 +60,12 @@
 static char *
 get_time (void)
 {
-  EMACS_TIME TV2 = sub_emacs_time (current_emacs_time (), TV1);
-  uintmax_t s = EMACS_SECS (TV2);
-  int ns = EMACS_NSECS (TV2);
+  struct timespec TV2 = timespec_sub (current_timespec (), TV1);
+  uintmax_t s = TV2.tv_sec;
+  int ns = TV2.tv_nsec;
   if (watch_not_started)
     exit (EXIT_FAILURE);  /* call reset_watch first ! */
-  sprintf (time_string, "%"PRIuMAX".%0*d", s, LOG10_EMACS_TIME_RESOLUTION, ns);
+  sprintf (time_string, "%"PRIuMAX".%0*d", s, LOG10_TIMESPEC_RESOLUTION, ns);
   return time_string;
 }
 

=== modified file 'lib/timespec.h'
--- a/lib/timespec.h    2013-01-01 09:11:05 +0000
+++ b/lib/timespec.h    2013-08-27 18:47:55 +0000
@@ -26,6 +26,23 @@
 # define _GL_TIMESPEC_INLINE _GL_INLINE
 #endif
 
+/* Resolution of timespec time stamps (in units per second), and log
+   base 10 of the resolution.  */
+
+enum { TIMESPEC_RESOLUTION = 1000000000 };
+enum { LOG10_TIMESPEC_RESOLUTION = 9 };
+
+/* Return a timespec with seconds S and nanoseconds NS.  */
+
+_GL_TIMESPEC_INLINE struct timespec
+make_timespec (time_t s, long int ns)
+{
+  struct timespec r;
+  r.tv_sec = s;
+  r.tv_nsec = ns;
+  return r;
+}
+
 /* Return negative, zero, positive if A < B, A == B, A > B, respectively.
 
    For each time stamp T, this code assumes that either:

=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2013-08-27 04:23:54 +0000
+++ b/src/ChangeLog     2013-08-27 18:47:55 +0000
@@ -1,3 +1,33 @@
+2013-08-27  Paul Eggert  <address@hidden>
+
+       Simplify EMACS_TIME-related code.
+       This portability layer is no longer needed, since Emacs has been
+       using struct timespec as a portability layer for some time.
+       * atimer.h, buffer.h, dispextern.h, xgselect.h:
+       Include <time.h> rather than "systime.h"; that's all that's needed now.
+       * dispnew.c: Include <timespec.h> rather than "systime.h";
+       that's all that's needed now.
+       * systime.h (EMACS_TIME): Remove.  All uses changed to struct timespec.
+       (EMACS_TIME_RESOLUTION): Remove.  All uses changed to
+       TIMESPEC_RESOLUTION.
+       (LOG10_EMACS_TIME_RESOLUTION): Remove.  All uses changed to
+       LOG10_TIMESPEC_RESOLUTION.
+       (EMACS_SECS, emacs_secs_addr): Remove.  All uses changed to tv_sec.
+       (EMACS_NSECS): Remove.  All uses changed to tv_nsec.
+       (make_emacs_time): Remove.  All used changed to make_timespec.
+       (invalid_timespec): Rename from invalid_emacs_time.  All uses changed.
+       (current_timespec): Rename from current_emacs_time.  All uses changed.
+       (add_emacs_time): Remove.  All uses changed to timespec_add.
+       (sub_emacs_time): Remove.  All uses change dot timespec_sub.
+       (EMACS_TIME_SIGN): Remove.  All uses changed to timespec_sign.
+       (timespec_valid_p): Rename from EMACS_TIME_VALID_P.  All uses changed.
+       (EMACS_TIME_FROM_DOUBLE): Remove.  All uses changed to dtotimespec.
+       (EMACS_TIME_TO_DOUBLE): Remove.  All uses changed to timespectod.
+       (current_timespec): Rename from current_emacs_time.  All uses changed.
+       (EMACS_TIME_EQ, EMACS_TIME_LT, EMACS_TIME_LE): Remove.  All uses
+       changed to timespec_cmp.
+       * xgselect.c: Include <timespec.h>, since our .h files don't.
+
 2013-08-27  Dmitry Antipov  <address@hidden>
 
        * xterm.h (FONT_TYPE_FOR_UNIBYTE, FONT_TYPE_FOR_MULTIBYTE:)

=== modified file 'src/alloc.c'
--- a/src/alloc.c       2013-08-26 05:26:06 +0000
+++ b/src/alloc.c       2013-08-27 18:47:55 +0000
@@ -5233,7 +5233,7 @@
   ptrdiff_t i;
   bool message_p;
   ptrdiff_t count = SPECPDL_INDEX ();
-  EMACS_TIME start;
+  struct timespec start;
   Lisp_Object retval = Qnil;
   size_t tot_before = 0;
 
@@ -5258,7 +5258,7 @@
   if (profiler_memory_running)
     tot_before = total_bytes_of_live_objects ();
 
-  start = current_emacs_time ();
+  start = current_timespec ();
 
   /* In case user calls debug_print during GC,
      don't let that cause a recursive GC.  */
@@ -5521,9 +5521,9 @@
   /* Accumulate statistics.  */
   if (FLOATP (Vgc_elapsed))
     {
-      EMACS_TIME since_start = sub_emacs_time (current_emacs_time (), start);
+      struct timespec since_start = timespec_sub (current_timespec (), start);
       Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed)
-                               + EMACS_TIME_TO_DOUBLE (since_start));
+                               + timespectod (since_start));
     }
 
   gcs_done++;

=== modified file 'src/atimer.c'
--- a/src/atimer.c      2013-07-16 21:35:45 +0000
+++ b/src/atimer.c      2013-08-27 18:47:55 +0000
@@ -94,17 +94,16 @@
    to cancel_atimer; don't free it yourself.  */
 
 struct atimer *
-start_atimer (enum atimer_type type, EMACS_TIME timestamp, atimer_callback fn,
-             void *client_data)
+start_atimer (enum atimer_type type, struct timespec timestamp,
+             atimer_callback fn, void *client_data)
 {
   struct atimer *t;
 
   /* Round TIME up to the next full second if we don't have
      itimers.  */
 #ifndef HAVE_SETITIMER
-  if (EMACS_NSECS (timestamp) != 0
-      && EMACS_SECS (timestamp) < TYPE_MAXIMUM (time_t))
-    timestamp = make_emacs_time (EMACS_SECS (timestamp) + 1, 0);
+  if (timestamp.tv_nsec != 0 && timestamp.tv_sec < TYPE_MAXIMUM (time_t))
+    timestamp = make_timespec (timestamp.tv_sec + 1, 0);
 #endif /* not HAVE_SETITIMER */
 
   /* Get an atimer structure from the free-list, or allocate
@@ -133,11 +132,11 @@
       break;
 
     case ATIMER_RELATIVE:
-      t->expiration = add_emacs_time (current_emacs_time (), timestamp);
+      t->expiration = timespec_add (current_timespec (), timestamp);
       break;
 
     case ATIMER_CONTINUOUS:
-      t->expiration = add_emacs_time (current_emacs_time (), timestamp);
+      t->expiration = timespec_add (current_timespec (), timestamp);
       t->interval = timestamp;
       break;
     }
@@ -284,7 +283,7 @@
 #ifdef HAVE_SETITIMER
       struct itimerval it;
 #endif
-      EMACS_TIME now, interval;
+      struct timespec now, interval;
 
 #ifdef HAVE_ITIMERSPEC
       if (alarm_timer_ok)
@@ -299,10 +298,10 @@
 
       /* Determine interval till the next timer is ripe.
         Don't set the interval to 0; this disables the timer.  */
-      now = current_emacs_time ();
-      interval = (EMACS_TIME_LE (atimers->expiration, now)
-                 ? make_emacs_time (0, 1000 * 1000)
-                 : sub_emacs_time (atimers->expiration, now));
+      now = current_timespec ();
+      interval = (timespec_cmp (atimers->expiration, now) <= 0
+                 ? make_timespec (0, 1000 * 1000)
+                 : timespec_sub (atimers->expiration, now));
 
 #ifdef HAVE_SETITIMER
 
@@ -310,7 +309,7 @@
       it.it_value = make_timeval (interval);
       setitimer (ITIMER_REAL, &it, 0);
 #else /* not HAVE_SETITIMER */
-      alarm (max (EMACS_SECS (interval), 1));
+      alarm (max (interval.tv_sec, 1));
 #endif /* not HAVE_SETITIMER */
     }
 }
@@ -326,7 +325,7 @@
   struct atimer *a = atimers, *prev = NULL;
 
   /* Look for the first atimer that is ripe after T.  */
-  while (a && EMACS_TIME_LT (a->expiration, t->expiration))
+  while (a && timespec_cmp (a->expiration, t->expiration) < 0)
     prev = a, a = a->next;
 
   /* Insert T in front of the atimer found, if any.  */
@@ -341,9 +340,9 @@
 static void
 run_timers (void)
 {
-  EMACS_TIME now = current_emacs_time ();
+  struct timespec now = current_timespec ();
 
-  while (atimers && EMACS_TIME_LE (atimers->expiration, now))
+  while (atimers && timespec_cmp (atimers->expiration, now) <= 0)
     {
       struct atimer *t = atimers;
       atimers = atimers->next;
@@ -351,7 +350,7 @@
 
       if (t->type == ATIMER_CONTINUOUS)
        {
-         t->expiration = add_emacs_time (now, t->interval);
+         t->expiration = timespec_add (now, t->interval);
          schedule_atimer (t);
        }
       else

=== modified file 'src/atimer.h'
--- a/src/atimer.h      2013-07-16 21:35:45 +0000
+++ b/src/atimer.h      2013-08-27 18:47:55 +0000
@@ -19,8 +19,8 @@
 #ifndef EMACS_ATIMER_H
 #define EMACS_ATIMER_H
 
-#include "systime.h"           /* for EMACS_TIME */
 #include <stdbool.h>
+#include <time.h>
 
 /* Forward declaration.  */
 
@@ -52,10 +52,10 @@
   enum atimer_type type;
 
   /* Time when this timer is ripe.  */
-  EMACS_TIME expiration;
+  struct timespec expiration;
 
   /* Interval of this timer.  */
-  EMACS_TIME interval;
+  struct timespec interval;
 
   /* Function to call when timer is ripe.  Interrupt input is
      guaranteed to not be blocked when this function is called.  */
@@ -70,7 +70,7 @@
 
 /* Function prototypes.  */
 
-struct atimer *start_atimer (enum atimer_type, EMACS_TIME,
+struct atimer *start_atimer (enum atimer_type, struct timespec,
                              atimer_callback, void *);
 void cancel_atimer (struct atimer *);
 void do_pending_atimers (void);

=== modified file 'src/buffer.c'
--- a/src/buffer.c      2013-08-16 22:32:24 +0000
+++ b/src/buffer.c      2013-08-27 18:47:55 +0000
@@ -933,7 +933,7 @@
   bset_filename (b, Qnil);
   bset_file_truename (b, Qnil);
   bset_directory (b, current_buffer ? BVAR (current_buffer, directory) : Qnil);
-  b->modtime = make_emacs_time (0, UNKNOWN_MODTIME_NSECS);
+  b->modtime = make_timespec (0, UNKNOWN_MODTIME_NSECS);
   b->modtime_size = -1;
   XSETFASTINT (BVAR (b, save_length), 0);
   b->last_window_start = 1;

=== modified file 'src/buffer.h'
--- a/src/buffer.h      2013-08-15 14:52:53 +0000
+++ b/src/buffer.h      2013-08-27 18:47:55 +0000
@@ -18,8 +18,8 @@
 You should have received a copy of the GNU General Public License
 along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include <sys/types.h> /* for off_t, time_t */
-#include "systime.h" /* for EMACS_TIME */
+#include <sys/types.h>
+#include <time.h>
 
 INLINE_HEADER_BEGIN
 #ifndef BUFFER_INLINE
@@ -794,13 +794,13 @@
   char local_flags[MAX_PER_BUFFER_VARS];
 
   /* Set to the modtime of the visited file when read or written.
-     EMACS_NSECS (modtime) == NONEXISTENT_MODTIME_NSECS means
-     visited file was nonexistent.  EMACS_NSECS (modtime) ==
+     modtime.tv_nsec == NONEXISTENT_MODTIME_NSECS means
+     visited file was nonexistent.  modtime.tv_nsec ==
      UNKNOWN_MODTIME_NSECS means visited file modtime unknown;
      in no case complain about any mismatch on next save attempt.  */
 #define NONEXISTENT_MODTIME_NSECS (-1)
 #define UNKNOWN_MODTIME_NSECS (-2)
-  EMACS_TIME modtime;
+  struct timespec modtime;
 
   /* Size of the file when modtime was set.  This is used to detect the
      case where the file grew while we were reading it, so the modtime

=== modified file 'src/dispextern.h'
--- a/src/dispextern.h  2013-08-27 03:52:21 +0000
+++ b/src/dispextern.h  2013-08-27 18:47:55 +0000
@@ -83,7 +83,7 @@
 #endif
 
 #ifdef HAVE_WINDOW_SYSTEM
-# include "systime.h"
+# include <time.h>
 #endif
 
 #ifndef HAVE_WINDOW_SYSTEM
@@ -2710,7 +2710,7 @@
     hlinfo->mouse_face_mouse_x = hlinfo->mouse_face_mouse_y = 0;
     hlinfo->mouse_face_beg_x = hlinfo->mouse_face_end_x = 0;
     hlinfo->mouse_face_face_id = DEFAULT_FACE_ID;
-    hlinfo->mouse_face_mouse_frame = NULL;    
+    hlinfo->mouse_face_mouse_frame = NULL;
     hlinfo->mouse_face_window = Qnil;
     hlinfo->mouse_face_overlay = Qnil;
     hlinfo->mouse_face_past_end = 0;
@@ -2914,7 +2914,7 @@
 {
   /* The time in seconds at which the image was last displayed.  Set
      in prepare_image_for_display.  */
-  EMACS_TIME timestamp;
+  struct timespec timestamp;
 
   /* Pixmaps of the image.  */
   Pixmap pixmap, mask;

=== modified file 'src/dispnew.c'
--- a/src/dispnew.c     2013-08-23 03:03:37 +0000
+++ b/src/dispnew.c     2013-08-27 18:47:55 +0000
@@ -49,12 +49,10 @@
 #include TERM_HEADER
 #endif /* HAVE_WINDOW_SYSTEM */
 
-/* Include systime.h after xterm.h to avoid double inclusion of time.h.  */
-
-#include "systime.h"
 #include <errno.h>
 
 #include <fpending.h>
+#include <timespec.h>
 
 #if defined (HAVE_TERM_H) && defined (GNU_LINUX)
 #include <term.h>              /* for tgetent */
@@ -5708,9 +5706,9 @@
 
   if (duration > 0)
     {
-      EMACS_TIME t = EMACS_TIME_FROM_DOUBLE (duration);
-      wait_reading_process_output (min (EMACS_SECS (t), WAIT_READING_MAX),
-                                  EMACS_NSECS (t), 0, 0, Qnil, NULL, 0);
+      struct timespec t = dtotimespec (duration);
+      wait_reading_process_output (min (t.tv_sec, WAIT_READING_MAX),
+                                  t.tv_nsec, 0, 0, Qnil, NULL, 0);
     }
 
   return Qnil;
@@ -5757,9 +5755,9 @@
        return Qt;
       else
        {
-         EMACS_TIME t = EMACS_TIME_FROM_DOUBLE (seconds);
-         sec = min (EMACS_SECS (t), WAIT_READING_MAX);
-         nsec = EMACS_NSECS (t);
+         struct timespec t = dtotimespec (seconds);
+         sec = min (t.tv_sec, WAIT_READING_MAX);
+         nsec = t.tv_nsec;
        }
     }
   else if (EQ (timeout, Qt))

=== modified file 'src/editfns.c'
--- a/src/editfns.c     2013-08-16 02:09:08 +0000
+++ b/src/editfns.c     2013-08-27 18:47:55 +0000
@@ -64,7 +64,7 @@
 extern Lisp_Object w32_get_internal_run_time (void);
 #endif
 
-static Lisp_Object format_time_string (char const *, ptrdiff_t, EMACS_TIME,
+static Lisp_Object format_time_string (char const *, ptrdiff_t, struct 
timespec,
                                       bool, struct tm *);
 static int tm_diff (struct tm *, struct tm *);
 static void update_buffer_properties (ptrdiff_t, ptrdiff_t);
@@ -1420,7 +1420,7 @@
 picosecond counts.  */)
   (void)
 {
-  return make_lisp_time (current_emacs_time ());
+  return make_lisp_time (current_timespec ());
 }
 
 DEFUN ("get-internal-run-time", Fget_internal_run_time, Sget_internal_run_time,
@@ -1450,7 +1450,7 @@
       usecs -= 1000000;
       secs++;
     }
-  return make_lisp_time (make_emacs_time (secs, usecs * 1000));
+  return make_lisp_time (make_timespec (secs, usecs * 1000));
 #else /* ! HAVE_GETRUSAGE  */
 #ifdef WINDOWSNT
   return w32_get_internal_run_time ();
@@ -1481,10 +1481,10 @@
    UNKNOWN_MODTIME_NSECS; in that case, the Lisp list contains a
    correspondingly negative picosecond count.  */
 Lisp_Object
-make_lisp_time (EMACS_TIME t)
+make_lisp_time (struct timespec t)
 {
-  int ns = EMACS_NSECS (t);
-  return make_time_tail (EMACS_SECS (t), list2i (ns / 1000, ns % 1000 * 1000));
+  int ns = t.tv_nsec;
+  return make_time_tail (t.tv_sec, list2i (ns / 1000, ns % 1000 * 1000));
 }
 
 /* Decode a Lisp list SPECIFIED_TIME that represents a time.
@@ -1529,7 +1529,7 @@
    list, generate the corresponding time value.
 
    If RESULT is not null, store into *RESULT the converted time;
-   this can fail if the converted time does not fit into EMACS_TIME.
+   this can fail if the converted time does not fit into struct timespec.
    If *DRESULT is not null, store into *DRESULT the number of
    seconds since the start of the POSIX Epoch.
 
@@ -1537,7 +1537,7 @@
 bool
 decode_time_components (Lisp_Object high, Lisp_Object low, Lisp_Object usec,
                        Lisp_Object psec,
-                       EMACS_TIME *result, double *dresult)
+                       struct timespec *result, double *dresult)
 {
   EMACS_INT hi, lo, us, ps;
   if (! (INTEGERP (high) && INTEGERP (low)
@@ -1565,7 +1565,7 @@
          /* Return the greatest representable time that is not greater
             than the requested time.  */
          time_t sec = hi;
-         *result = make_emacs_time ((sec << 16) + lo, us * 1000 + ps / 1000);
+         *result = make_timespec ((sec << 16) + lo, us * 1000 + ps / 1000);
        }
       else
        {
@@ -1583,15 +1583,15 @@
 /* Decode a Lisp list SPECIFIED_TIME that represents a time.
    If SPECIFIED_TIME is nil, use the current time.
 
-   Round the time down to the nearest EMACS_TIME value.
+   Round the time down to the nearest struct timespec value.
    Return seconds since the Epoch.
    Signal an error if unsuccessful.  */
-EMACS_TIME
+struct timespec
 lisp_time_argument (Lisp_Object specified_time)
 {
-  EMACS_TIME t;
+  struct timespec t;
   if (NILP (specified_time))
-    t = current_emacs_time ();
+    t = current_timespec ();
   else
     {
       Lisp_Object high, low, usec, psec;
@@ -1613,12 +1613,12 @@
   else
     {
       Lisp_Object high, low, usec, psec;
-      EMACS_TIME t;
+      struct timespec t;
       if (! (disassemble_lisp_time (specified_time, &high, &low, &usec, &psec)
             && decode_time_components (high, low, make_number (0),
                                        make_number (0), &t, 0)))
        error ("Invalid time specification");
-      return EMACS_SECS (t);
+      return t.tv_sec;
     }
 }
 
@@ -1639,8 +1639,8 @@
   double t;
   if (NILP (specified_time))
     {
-      EMACS_TIME now = current_emacs_time ();
-      t = EMACS_SECS (now) + EMACS_NSECS (now) / 1e9;
+      struct timespec now = current_timespec ();
+      t = now.tv_sec + now.tv_nsec / 1e9;
     }
   else
     {
@@ -1758,7 +1758,7 @@
 usage: (format-time-string FORMAT-STRING &optional TIME UNIVERSAL)  */)
   (Lisp_Object format_string, Lisp_Object timeval, Lisp_Object universal)
 {
-  EMACS_TIME t = lisp_time_argument (timeval);
+  struct timespec t = lisp_time_argument (timeval);
   struct tm tm;
 
   CHECK_STRING (format_string);
@@ -1770,20 +1770,20 @@
 
 static Lisp_Object
 format_time_string (char const *format, ptrdiff_t formatlen,
-                   EMACS_TIME t, bool ut, struct tm *tmp)
+                   struct timespec t, bool ut, struct tm *tmp)
 {
   char buffer[4000];
   char *buf = buffer;
   ptrdiff_t size = sizeof buffer;
   size_t len;
   Lisp_Object bufstring;
-  int ns = EMACS_NSECS (t);
+  int ns = t.tv_nsec;
   struct tm *tm;
   USE_SAFE_ALLOCA;
 
   while (1)
     {
-      time_t *taddr = emacs_secs_addr (&t);
+      time_t *taddr = &t.tv_sec;
       block_input ();
 
       synchronize_system_time_locale ();
@@ -2068,17 +2068,17 @@
 the data it can't find.  */)
   (Lisp_Object specified_time)
 {
-  EMACS_TIME value;
+  struct timespec value;
   int offset;
   struct tm *t;
   struct tm localtm;
   Lisp_Object zone_offset, zone_name;
 
   zone_offset = Qnil;
-  value = make_emacs_time (lisp_seconds_argument (specified_time), 0);
+  value = make_timespec (lisp_seconds_argument (specified_time), 0);
   zone_name = format_time_string ("%Z", sizeof "%Z" - 1, value, 0, &localtm);
   block_input ();
-  t = gmtime (emacs_secs_addr (&value));
+  t = gmtime (&value.tv_sec);
   if (t)
     offset = tm_diff (&localtm, t);
   unblock_input ();

=== modified file 'src/fileio.c'
--- a/src/fileio.c      2013-08-23 17:57:07 +0000
+++ b/src/fileio.c      2013-08-27 18:47:55 +0000
@@ -2045,7 +2045,7 @@
   /* CopyFile retains the timestamp by default.  */
   else if (NILP (keep_time))
     {
-      EMACS_TIME now;
+      struct timespec now;
       DWORD attributes;
       char * filename;
 
@@ -2054,7 +2054,7 @@
       /* Ensure file is writable while its modified time is set.  */
       attributes = GetFileAttributes (filename);
       SetFileAttributes (filename, attributes & ~FILE_ATTRIBUTE_READONLY);
-      now = current_emacs_time ();
+      now = current_timespec ();
       if (set_file_times (-1, filename, now, now))
        {
          /* Restore original attributes.  */
@@ -2178,8 +2178,8 @@
 
   if (!NILP (keep_time))
     {
-      EMACS_TIME atime = get_stat_atime (&st);
-      EMACS_TIME mtime = get_stat_mtime (&st);
+      struct timespec atime = get_stat_atime (&st);
+      struct timespec mtime = get_stat_mtime (&st);
       if (set_file_times (ofd, SSDATA (encoded_newname), atime, mtime))
        xsignal2 (Qfile_date_error,
                  build_string ("Cannot set file date"), newname);
@@ -3286,7 +3286,7 @@
 {
   Lisp_Object absname, encoded_absname;
   Lisp_Object handler;
-  EMACS_TIME t = lisp_time_argument (timestamp);
+  struct timespec t = lisp_time_argument (timestamp);
 
   absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
 
@@ -3363,7 +3363,7 @@
   if (stat (SSDATA (absname2), &st2) < 0)
     return Qt;
 
-  return (EMACS_TIME_LT (get_stat_mtime (&st2), get_stat_mtime (&st1))
+  return (timespec_cmp (get_stat_mtime (&st2), get_stat_mtime (&st1)) < 0
          ? Qt : Qnil);
 }
 
@@ -3463,13 +3463,13 @@
 }
 
 /* Return a special time value indicating the error number ERRNUM.  */
-static EMACS_TIME
+static struct timespec
 time_error_value (int errnum)
 {
   int ns = (errnum == ENOENT || errnum == EACCES || errnum == ENOTDIR
            ? NONEXISTENT_MODTIME_NSECS
            : UNKNOWN_MODTIME_NSECS);
-  return make_emacs_time (0, ns);
+  return make_timespec (0, ns);
 }
 
 DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents,
@@ -3501,7 +3501,7 @@
   (Lisp_Object filename, Lisp_Object visit, Lisp_Object beg, Lisp_Object end, 
Lisp_Object replace)
 {
   struct stat st;
-  EMACS_TIME mtime;
+  struct timespec mtime;
   int fd;
   ptrdiff_t inserted = 0;
   ptrdiff_t how_much;
@@ -4567,7 +4567,7 @@
     }
 
   if (!NILP (visit)
-      && EMACS_NSECS (current_buffer->modtime) == NONEXISTENT_MODTIME_NSECS)
+      && current_buffer->modtime.tv_nsec == NONEXISTENT_MODTIME_NSECS)
     {
       /* If visiting nonexistent file, return nil.  */
       report_file_errno ("Opening input file", orig_filename, save_errno);
@@ -4766,7 +4766,7 @@
   int save_errno = 0;
   const char *fn;
   struct stat st;
-  EMACS_TIME modtime;
+  struct timespec modtime;
   ptrdiff_t count = SPECPDL_INDEX ();
   ptrdiff_t count1 IF_LINT (= 0);
   Lisp_Object handler;
@@ -4980,7 +4980,7 @@
          }
     }
 
-  modtime = invalid_emacs_time ();
+  modtime = invalid_timespec ();
   if (visiting)
     {
       if (fstat (desc, &st) == 0)
@@ -5014,7 +5014,7 @@
      unlikely and a similar race between the last write and the fstat
      above cannot possibly be closed anyway.  */
 
-  if (EMACS_TIME_VALID_P (modtime)
+  if (timespec_valid_p (modtime)
       && ! (valid_timestamp_file_system && st.st_dev == timestamp_file_system))
     {
       int desc1 = emacs_open (fn, O_WRONLY | O_BINARY, 0);
@@ -5036,11 +5036,11 @@
              bool use_heuristic
                = ((open_flags & (O_EXCL | O_TRUNC)) != 0
                   && st.st_size != 0
-                  && EMACS_NSECS (modtime) % 100 != 0);
+                  && modtime.tv_nsec % 100 != 0);
 
-             EMACS_TIME modtime1 = get_stat_mtime (&st1);
+             struct timespec modtime1 = get_stat_mtime (&st1);
              if (use_heuristic
-                 && EMACS_TIME_EQ (modtime, modtime1)
+                 && timespec_cmp (modtime, modtime1) == 0
                  && st.st_size == st1.st_size)
                {
                  timestamp_file_system = st.st_dev;
@@ -5080,7 +5080,7 @@
   /* Do this before reporting IO error
      to avoid a "file has changed on disk" warning on
      next attempt to save.  */
-  if (EMACS_TIME_VALID_P (modtime))
+  if (timespec_valid_p (modtime))
     {
       current_buffer->modtime = modtime;
       current_buffer->modtime_size = st.st_size;
@@ -5355,7 +5355,7 @@
   struct stat st;
   Lisp_Object handler;
   Lisp_Object filename;
-  EMACS_TIME mtime;
+  struct timespec mtime;
 
   if (NILP (buf))
     b = current_buffer;
@@ -5366,7 +5366,7 @@
     }
 
   if (!STRINGP (BVAR (b, filename))) return Qt;
-  if (EMACS_NSECS (b->modtime) == UNKNOWN_MODTIME_NSECS) return Qt;
+  if (b->modtime.tv_nsec == UNKNOWN_MODTIME_NSECS) return Qt;
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
@@ -5380,7 +5380,7 @@
   mtime = (stat (SSDATA (filename), &st) == 0
           ? get_stat_mtime (&st)
           : time_error_value (errno));
-  if (EMACS_TIME_EQ (mtime, b->modtime)
+  if (timespec_cmp (mtime, b->modtime) == 0
       && (b->modtime_size < 0
          || st.st_size == b->modtime_size))
     return Qt;
@@ -5397,7 +5397,7 @@
 See Info node `(elisp)Modification Time' for more details.  */)
   (void)
 {
-  int ns = EMACS_NSECS (current_buffer->modtime);
+  int ns = current_buffer->modtime.tv_nsec;
   if (ns < 0)
     return make_number (UNKNOWN_MODTIME_NSECS - ns);
   return make_lisp_time (current_buffer->modtime);
@@ -5416,11 +5416,11 @@
 {
   if (!NILP (time_flag))
     {
-      EMACS_TIME mtime;
+      struct timespec mtime;
       if (INTEGERP (time_flag))
        {
          CHECK_RANGED_INTEGER (time_flag, -1, 0);
-         mtime = make_emacs_time (0, UNKNOWN_MODTIME_NSECS - XINT (time_flag));
+         mtime = make_timespec (0, UNKNOWN_MODTIME_NSECS - XINT (time_flag));
        }
       else
        mtime = lisp_time_argument (time_flag);
@@ -5683,12 +5683,12 @@
                || NILP (Ffind_file_name_handler (BVAR (b, auto_save_file_name),
                                                  Qwrite_region))))
          {
-           EMACS_TIME before_time = current_emacs_time ();
-           EMACS_TIME after_time;
+           struct timespec before_time = current_timespec ();
+           struct timespec after_time;
 
            /* If we had a failure, don't try again for 20 minutes.  */
            if (b->auto_save_failure_time > 0
-               && EMACS_SECS (before_time) - b->auto_save_failure_time < 1200)
+               && before_time.tv_sec - b->auto_save_failure_time < 1200)
              continue;
 
            set_buffer_internal (b);
@@ -5721,12 +5721,12 @@
            XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
            set_buffer_internal (old);
 
-           after_time = current_emacs_time ();
+           after_time = current_timespec ();
 
            /* If auto-save took more than 60 seconds,
               assume it was an NFS failure that got a timeout.  */
-           if (EMACS_SECS (after_time) - EMACS_SECS (before_time) > 60)
-             b->auto_save_failure_time = EMACS_SECS (after_time);
+           if (after_time.tv_sec - before_time.tv_sec > 60)
+             b->auto_save_failure_time = after_time.tv_sec;
          }
       }
 

=== modified file 'src/gtkutil.c'
--- a/src/gtkutil.c     2013-08-27 04:23:54 +0000
+++ b/src/gtkutil.c     2013-08-27 18:47:55 +0000
@@ -1685,15 +1685,15 @@
 xg_maybe_add_timer (gpointer data)
 {
   struct xg_dialog_data *dd = data;
-  EMACS_TIME next_time = timer_check ();
+  struct timespec next_time = timer_check ();
 
   dd->timerid = 0;
 
-  if (EMACS_TIME_VALID_P (next_time))
+  if (timespec_valid_p (next_time))
     {
-      time_t s = EMACS_SECS (next_time);
-      int per_ms = EMACS_TIME_RESOLUTION / 1000;
-      int ms = (EMACS_NSECS (next_time) + per_ms - 1) / per_ms;
+      time_t s = next_time.tv_sec;
+      int per_ms = TIMESPEC_RESOLUTION / 1000;
+      int ms = (next_time.tv_nsec + per_ms - 1) / per_ms;
       if (s <= ((guint) -1 - ms) / 1000)
        dd->timerid = g_timeout_add (s * 1000 + ms, xg_maybe_add_timer, dd);
     }

=== modified file 'src/image.c'
--- a/src/image.c       2013-08-27 04:23:54 +0000
+++ b/src/image.c       2013-08-27 18:47:55 +0000
@@ -1041,7 +1041,7 @@
 prepare_image_for_display (struct frame *f, struct image *img)
 {
   /* We're about to display IMG, so set its timestamp to `now'.  */
-  img->timestamp = current_emacs_time ();
+  img->timestamp = current_timespec ();
 
   /* If IMG doesn't have a pixmap yet, load it now, using the image
      type dependent loader function.  */
@@ -1480,7 +1480,7 @@
       else if (INTEGERP (Vimage_cache_eviction_delay))
        {
          /* Free cache based on timestamp.  */
-         EMACS_TIME old, t;
+         struct timespec old, t;
          double delay;
          ptrdiff_t nimages = 0;
 
@@ -1495,13 +1495,13 @@
            delay = 1600 * delay / nimages / nimages;
          delay = max (delay, 1);
 
-         t = current_emacs_time ();
-         old = sub_emacs_time (t, EMACS_TIME_FROM_DOUBLE (delay));
+         t = current_timespec ();
+         old = timespec_sub (t, dtotimespec (delay));
 
          for (i = 0; i < c->used; ++i)
            {
              struct image *img = c->images[i];
-             if (img && EMACS_TIME_LT (img->timestamp, old))
+             if (img && timespec_cmp (img->timestamp, old) < 0)
                {
                  free_image (f, img);
                  ++nfreed;
@@ -1764,7 +1764,7 @@
     }
 
   /* We're using IMG, so set its timestamp to `now'.  */
-  img->timestamp = current_emacs_time ();
+  img->timestamp = current_timespec ();
 
   /* Value is the image id.  */
   return img->id;
@@ -7884,7 +7884,7 @@
 {
   MagickWand *wand;
   int index;
-  EMACS_TIME update_time;
+  struct timespec update_time;
   struct animation_cache *next;
   char signature[FLEXIBLE_ARRAY_MEMBER];
 };
@@ -7909,13 +7909,13 @@
 imagemagick_prune_animation_cache (void)
 {
   struct animation_cache **pcache = &animation_cache;
-  EMACS_TIME old = sub_emacs_time (current_emacs_time (),
-                                  make_emacs_time (60, 0));
+  struct timespec old = timespec_sub (current_timespec (),
+                                     make_timespec (60, 0));
 
   while (*pcache)
     {
       struct animation_cache *cache = *pcache;
-      if (EMACS_TIME_LE (old, cache->update_time))
+      if (timespec_cmp (old, cache->update_time) <= 0)
        pcache = &cache->next;
       else
        {
@@ -7950,7 +7950,7 @@
     }
 
   DestroyString (signature);
-  cache->update_time = current_emacs_time ();
+  cache->update_time = current_timespec ();
   return cache;
 }
 

=== modified file 'src/keyboard.c'
--- a/src/keyboard.c    2013-08-13 08:39:14 +0000
+++ b/src/keyboard.c    2013-08-27 18:47:55 +0000
@@ -360,7 +360,7 @@
 static void recursive_edit_unwind (Lisp_Object buffer);
 static Lisp_Object command_loop (void);
 static Lisp_Object Qcommand_execute;
-EMACS_TIME timer_check (void);
+struct timespec timer_check (void);
 
 static void echo_now (void);
 static ptrdiff_t echo_length (void);
@@ -370,9 +370,9 @@
 /* Incremented whenever a timer is run.  */
 unsigned timers_run;
 
-/* Address (if not 0) of EMACS_TIME to zero out if a SIGIO interrupt
+/* Address (if not 0) of struct timespec to zero out if a SIGIO interrupt
    happens.  */
-EMACS_TIME *input_available_clear_time;
+struct timespec *input_available_clear_time;
 
 /* True means use SIGIO interrupts; false means use CBREAK mode.
    Default is true if INTERRUPT_INPUT is defined.  */
@@ -389,12 +389,12 @@
 
 /* The time when Emacs started being idle.  */
 
-static EMACS_TIME timer_idleness_start_time;
+static struct timespec timer_idleness_start_time;
 
 /* After Emacs stops being idle, this saves the last value
    of timer_idleness_start_time from when it was idle.  */
 
-static EMACS_TIME timer_last_idleness_start_time;
+static struct timespec timer_last_idleness_start_time;
 
 
 /* Global variable declarations.  */
@@ -1986,10 +1986,10 @@
       /* If poll timer doesn't exist, are we need one with
         a different interval, start a new one.  */
       if (poll_timer == NULL
-         || EMACS_SECS (poll_timer->interval) != polling_period)
+         || poll_timer->interval.tv_sec != polling_period)
        {
          time_t period = max (1, min (polling_period, TYPE_MAXIMUM (time_t)));
-         EMACS_TIME interval = make_emacs_time (period, 0);
+         struct timespec interval = make_timespec (period, 0);
 
          if (poll_timer)
            cancel_atimer (poll_timer);
@@ -2182,7 +2182,7 @@
 /* Input of single characters from keyboard */
 
 static Lisp_Object kbd_buffer_get_event (KBOARD **kbp, bool *used_mouse_menu,
-                                        EMACS_TIME *end_time);
+                                        struct timespec *end_time);
 static void record_char (Lisp_Object c);
 
 static Lisp_Object help_form_saved_window_configs;
@@ -2204,7 +2204,7 @@
        polling_stopped_here = 0; } while (0)
 
 static Lisp_Object
-read_event_from_main_queue (EMACS_TIME *end_time,
+read_event_from_main_queue (struct timespec *end_time,
                             sys_jmp_buf local_getcjmp,
                             bool *used_mouse_menu)
 {
@@ -2217,7 +2217,7 @@
   /* Read from the main queue, and if that gives us something we can't use yet,
      we put it on the appropriate side queue and try again.  */
 
-  if (end_time && EMACS_TIME_LE (*end_time, current_emacs_time ()))
+  if (end_time && timespec_cmp (*end_time, current_timespec ()) <= 0)
     return c;
 
   /* Actually read a character, waiting if necessary.  */
@@ -2278,7 +2278,7 @@
 /* Like `read_event_from_main_queue' but applies keyboard-coding-system
    to tty input.  */
 static Lisp_Object
-read_decoded_event_from_main_queue (EMACS_TIME *end_time,
+read_decoded_event_from_main_queue (struct timespec *end_time,
                                     sys_jmp_buf local_getcjmp,
                                     Lisp_Object prev_event,
                                     bool *used_mouse_menu)
@@ -2376,7 +2376,7 @@
    Value is -2 when we find input on another keyboard.  A second call
    to read_char will read it.
 
-   If END_TIME is non-null, it is a pointer to an EMACS_TIME
+   If END_TIME is non-null, it is a pointer to a struct timespec
    specifying the maximum time to wait until.  If no input arrives by
    that time, stop waiting and return nil.
 
@@ -2385,7 +2385,7 @@
 Lisp_Object
 read_char (int commandflag, Lisp_Object map,
           Lisp_Object prev_event,
-          bool *used_mouse_menu, EMACS_TIME *end_time)
+          bool *used_mouse_menu, struct timespec *end_time)
 {
   Lisp_Object c;
   ptrdiff_t jmpcount;
@@ -2877,7 +2877,7 @@
     {
       c = read_decoded_event_from_main_queue (end_time, local_getcjmp,
                                               prev_event, used_mouse_menu);
-      if (end_time && EMACS_TIME_LE (*end_time, current_emacs_time ()))
+      if (end_time && timespec_cmp (*end_time, current_timespec ()) <= 0)
         goto exit;
       if (EQ (c, make_number (-2)))
         {
@@ -3798,7 +3798,7 @@
 static Lisp_Object
 kbd_buffer_get_event (KBOARD **kbp,
                       bool *used_mouse_menu,
-                      EMACS_TIME *end_time)
+                      struct timespec *end_time)
 {
   Lisp_Object obj;
 
@@ -3856,15 +3856,15 @@
        break;
       if (end_time)
        {
-         EMACS_TIME now = current_emacs_time ();
-         if (EMACS_TIME_LE (*end_time, now))
+         struct timespec now = current_timespec ();
+         if (timespec_cmp (*end_time, now) <= 0)
            return Qnil;        /* Finished waiting.  */
          else
            {
-             EMACS_TIME duration = sub_emacs_time (*end_time, now);
-             wait_reading_process_output (min (EMACS_SECS (duration),
+             struct timespec duration = timespec_sub (*end_time, now);
+             wait_reading_process_output (min (duration.tv_sec,
                                                WAIT_READING_MAX),
-                                          EMACS_NSECS (duration),
+                                          duration.tv_nsec,
                                           -1, 1, Qnil, NULL, 0);
            }
        }
@@ -4295,10 +4295,10 @@
 timer_start_idle (void)
 {
   /* If we are already in the idle state, do nothing.  */
-  if (EMACS_TIME_VALID_P (timer_idleness_start_time))
+  if (timespec_valid_p (timer_idleness_start_time))
     return;
 
-  timer_idleness_start_time = current_emacs_time ();
+  timer_idleness_start_time = current_timespec ();
   timer_last_idleness_start_time = timer_idleness_start_time;
 
   /* Mark all idle-time timers as once again candidates for running.  */
@@ -4310,7 +4310,7 @@
 static void
 timer_stop_idle (void)
 {
-  timer_idleness_start_time = invalid_emacs_time ();
+  timer_idleness_start_time = invalid_timespec ();
 }
 
 /* Resume idle timer from last idle start time.  */
@@ -4318,7 +4318,7 @@
 static void
 timer_resume_idle (void)
 {
-  if (EMACS_TIME_VALID_P (timer_idleness_start_time))
+  if (timespec_valid_p (timer_idleness_start_time))
     return;
 
   timer_idleness_start_time = timer_last_idleness_start_time;
@@ -4334,7 +4334,7 @@
 
 /* Return true if TIMER is a valid timer, placing its value into *RESULT.  */
 static bool
-decode_timer (Lisp_Object timer, EMACS_TIME *result)
+decode_timer (Lisp_Object timer, struct timespec *result)
 {
   Lisp_Object *vector;
 
@@ -4361,16 +4361,16 @@
    In that case we return 0 to indicate that a new timer_check_2 call
    should be done.  */
 
-static EMACS_TIME
+static struct timespec
 timer_check_2 (Lisp_Object timers, Lisp_Object idle_timers)
 {
-  EMACS_TIME nexttime;
-  EMACS_TIME now;
-  EMACS_TIME idleness_now;
+  struct timespec nexttime;
+  struct timespec now;
+  struct timespec idleness_now;
   Lisp_Object chosen_timer;
   struct gcpro gcpro1;
 
-  nexttime = invalid_emacs_time ();
+  nexttime = invalid_timespec ();
 
   chosen_timer = Qnil;
   GCPRO1 (chosen_timer);
@@ -4385,19 +4385,19 @@
 
   if (CONSP (timers) || CONSP (idle_timers))
     {
-      now = current_emacs_time ();
-      idleness_now = (EMACS_TIME_VALID_P (timer_idleness_start_time)
-                     ? sub_emacs_time (now, timer_idleness_start_time)
-                     : make_emacs_time (0, 0));
+      now = current_timespec ();
+      idleness_now = (timespec_valid_p (timer_idleness_start_time)
+                     ? timespec_sub (now, timer_idleness_start_time)
+                     : make_timespec (0, 0));
     }
 
   while (CONSP (timers) || CONSP (idle_timers))
     {
       Lisp_Object timer = Qnil, idle_timer = Qnil;
-      EMACS_TIME timer_time, idle_timer_time;
-      EMACS_TIME difference;
-      EMACS_TIME timer_difference = invalid_emacs_time ();
-      EMACS_TIME idle_timer_difference = invalid_emacs_time ();
+      struct timespec timer_time, idle_timer_time;
+      struct timespec difference;
+      struct timespec timer_difference = invalid_timespec ();
+      struct timespec idle_timer_difference = invalid_timespec ();
       bool ripe, timer_ripe = 0, idle_timer_ripe = 0;
 
       /* Set TIMER and TIMER_DIFFERENCE
@@ -4414,10 +4414,10 @@
              continue;
            }
 
-         timer_ripe = EMACS_TIME_LE (timer_time, now);
+         timer_ripe = timespec_cmp (timer_time, now) <= 0;
          timer_difference = (timer_ripe
-                             ? sub_emacs_time (now, timer_time)
-                             : sub_emacs_time (timer_time, now));
+                             ? timespec_sub (now, timer_time)
+                             : timespec_sub (timer_time, now));
        }
 
       /* Likewise for IDLE_TIMER and IDLE_TIMER_DIFFERENCE
@@ -4431,26 +4431,27 @@
              continue;
            }
 
-         idle_timer_ripe = EMACS_TIME_LE (idle_timer_time, idleness_now);
+         idle_timer_ripe = timespec_cmp (idle_timer_time, idleness_now) <= 0;
          idle_timer_difference
            = (idle_timer_ripe
-              ? sub_emacs_time (idleness_now, idle_timer_time)
-              : sub_emacs_time (idle_timer_time, idleness_now));
+              ? timespec_sub (idleness_now, idle_timer_time)
+              : timespec_sub (idle_timer_time, idleness_now));
        }
 
       /* Decide which timer is the next timer,
         and set CHOSEN_TIMER, DIFFERENCE, and RIPE accordingly.
         Also step down the list where we found that timer.  */
 
-      if (EMACS_TIME_VALID_P (timer_difference)
-         && (! EMACS_TIME_VALID_P (idle_timer_difference)
+      if (timespec_valid_p (timer_difference)
+         && (! timespec_valid_p (idle_timer_difference)
              || idle_timer_ripe < timer_ripe
              || (idle_timer_ripe == timer_ripe
-                 && (timer_ripe
-                     ? EMACS_TIME_LT (idle_timer_difference,
+                 && ((timer_ripe
+                      ? timespec_cmp (idle_timer_difference,
                                       timer_difference)
-                     : EMACS_TIME_LT (timer_difference,
-                                      idle_timer_difference)))))
+                      : timespec_cmp (timer_difference,
+                                      idle_timer_difference))
+                     < 0))))
        {
          chosen_timer = timer;
          timers = XCDR (timers);
@@ -4490,7 +4491,7 @@
                  return 0 to indicate that.  */
            }
 
-         nexttime = make_emacs_time (0, 0);
+         nexttime = make_timespec (0, 0);
           break;
        }
       else
@@ -4518,10 +4519,10 @@
 
    As long as any timer is ripe, we run it.  */
 
-EMACS_TIME
+struct timespec
 timer_check (void)
 {
-  EMACS_TIME nexttime;
+  struct timespec nexttime;
   Lisp_Object timers, idle_timers;
   struct gcpro gcpro1, gcpro2;
 
@@ -4535,7 +4536,7 @@
   /* Always consider the ordinary timers.  */
   timers = Fcopy_sequence (Vtimer_list);
   /* Consider the idle timers only if Emacs is idle.  */
-  if (EMACS_TIME_VALID_P (timer_idleness_start_time))
+  if (timespec_valid_p (timer_idleness_start_time))
     idle_timers = Fcopy_sequence (Vtimer_idle_list);
   else
     idle_timers = Qnil;
@@ -4548,7 +4549,7 @@
     {
       nexttime = timer_check_2 (timers, idle_timers);
     }
-  while (EMACS_SECS (nexttime) == 0 && EMACS_NSECS (nexttime) == 0);
+  while (nexttime.tv_sec == 0 && nexttime.tv_nsec == 0);
 
   UNGCPRO;
   return nexttime;
@@ -4564,9 +4565,9 @@
 PSEC is a multiple of the system clock resolution.  */)
   (void)
 {
-  if (EMACS_TIME_VALID_P (timer_idleness_start_time))
-    return make_lisp_time (sub_emacs_time (current_emacs_time (),
-                                          timer_idleness_start_time));
+  if (timespec_valid_p (timer_idleness_start_time))
+    return make_lisp_time (timespec_sub (current_timespec (),
+                                        timer_idleness_start_time));
 
   return Qnil;
 }
@@ -7126,7 +7127,7 @@
   pending_signals = 1;
 
   if (input_available_clear_time)
-    *input_available_clear_time = make_emacs_time (0, 0);
+    *input_available_clear_time = make_timespec (0, 0);
 }
 
 static void
@@ -7213,7 +7214,7 @@
            /* Tell wait_reading_process_output that it needs to wake
               up and look around.  */
            if (input_available_clear_time)
-             *input_available_clear_time = make_emacs_time (0, 0);
+             *input_available_clear_time = make_timespec (0, 0);
          }
        break;
       }
@@ -10235,7 +10236,7 @@
 }
 
 void
-set_waiting_for_input (EMACS_TIME *time_to_clear)
+set_waiting_for_input (struct timespec *time_to_clear)
 {
   input_available_clear_time = time_to_clear;
 
@@ -10846,7 +10847,7 @@
   immediate_quit = 0;
   quit_char = Ctl ('g');
   Vunread_command_events = Qnil;
-  timer_idleness_start_time = invalid_emacs_time ();
+  timer_idleness_start_time = invalid_timespec ();
   total_keys = 0;
   recent_keys_index = 0;
   kbd_fetch_ptr = kbd_buffer;

=== modified file 'src/keyboard.h'
--- a/src/keyboard.h    2013-07-16 21:35:45 +0000
+++ b/src/keyboard.h    2013-08-27 18:47:55 +0000
@@ -17,7 +17,7 @@
 You should have received a copy of the GNU General Public License
 along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include "systime.h"           /* for EMACS_TIME, Time */
+#include "systime.h"           /* for struct timespec, Time */
 #include "coding.h"             /* for ENCODE_UTF_8 and ENCODE_SYSTEM */
 
 INLINE_HEADER_BEGIN
@@ -466,9 +466,9 @@
 /* True while doing kbd input.  */
 extern bool waiting_for_input;
 
-/* Address (if not 0) of EMACS_TIME to zero out if a SIGIO interrupt
+/* Address (if not 0) of struct timespec to zero out if a SIGIO interrupt
    happens.  */
-extern EMACS_TIME *input_available_clear_time;
+extern struct timespec *input_available_clear_time;
 
 #if defined HAVE_WINDOW_SYSTEM && !defined USE_GTK && !defined HAVE_NS
 extern bool ignore_mouse_drag_p;
@@ -483,7 +483,7 @@
 extern Lisp_Object parse_modifiers (Lisp_Object);
 extern Lisp_Object reorder_modifiers (Lisp_Object);
 extern Lisp_Object read_char (int, Lisp_Object, Lisp_Object,
-                              bool *, EMACS_TIME *);
+                              bool *, struct timespec *);
 extern int parse_solitary_modifier (Lisp_Object symbol);
 
 
@@ -549,7 +549,7 @@
 extern void add_user_signal (int, const char *);
 
 extern int tty_read_avail_input (struct terminal *, struct input_event *);
-extern EMACS_TIME timer_check (void);
+extern struct timespec timer_check (void);
 extern void mark_kboards (void);
 
 #ifdef HAVE_NTGUI

=== modified file 'src/lread.c'
--- a/src/lread.c       2013-08-26 20:33:21 +0000
+++ b/src/lread.c       2013-08-27 18:47:55 +0000
@@ -609,7 +609,7 @@
                     bool error_nonascii, bool input_method, Lisp_Object 
seconds)
 {
   Lisp_Object val, delayed_switch_frame;
-  EMACS_TIME end_time;
+  struct timespec end_time;
 
 #ifdef HAVE_WINDOW_SYSTEM
   if (display_hourglass_p)
@@ -622,8 +622,8 @@
   if (NUMBERP (seconds))
     {
       double duration = extract_float (seconds);
-      EMACS_TIME wait_time = EMACS_TIME_FROM_DOUBLE (duration);
-      end_time = add_emacs_time (current_emacs_time (), wait_time);
+      struct timespec wait_time = dtotimespec (duration);
+      end_time = timespec_add (current_timespec (), wait_time);
     }
 
   /* Read until we get an acceptable event.  */
@@ -1262,7 +1262,7 @@
            }
 
          if (result == 0
-             && EMACS_TIME_LT (get_stat_mtime (&s1), get_stat_mtime (&s2)))
+             && timespec_cmp (get_stat_mtime (&s1), get_stat_mtime (&s2)) < 0)
            {
              /* Make the progress messages mention that source is newer.  */
              newer = 1;

=== modified file 'src/msdos.c'
--- a/src/msdos.c       2013-08-27 03:52:21 +0000
+++ b/src/msdos.c       2013-08-27 18:47:55 +0000
@@ -4055,7 +4055,7 @@
    because wait_reading_process_output takes care of that.  */
 int
 sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
-           EMACS_TIME *timeout, void *ignored)
+           struct timespec *timeout, void *ignored)
 {
   int check_input;
   struct timespec t;
@@ -4085,20 +4085,20 @@
     }
   else
     {
-      EMACS_TIME clnow, cllast, cldiff;
+      struct timespec clnow, cllast, cldiff;
 
       gettime (&t);
-      cllast = make_emacs_time (t.tv_sec, t.tv_nsec);
+      cllast = make_timespec (t.tv_sec, t.tv_nsec);
 
       while (!check_input || !detect_input_pending ())
        {
          gettime (&t);
-         clnow = make_emacs_time (t.tv_sec, t.tv_nsec);
-         cldiff = sub_emacs_time (clnow, cllast);
-         *timeout = sub_emacs_time (*timeout, cldiff);
+         clnow = make_timespec (t.tv_sec, t.tv_nsec);
+         cldiff = timespec_sub (clnow, cllast);
+         *timeout = timespec_sub (*timeout, cldiff);
 
          /* Stop when timeout value crosses zero.  */
-         if (EMACS_TIME_SIGN (*timeout) <= 0)
+         if (timespec_sign (*timeout) <= 0)
            return 0;
          cllast = clnow;
          dos_yield_time_slice ();

=== modified file 'src/nsmenu.m'
--- a/src/nsmenu.m      2013-08-26 21:31:50 +0000
+++ b/src/nsmenu.m      2013-08-27 18:47:55 +0000
@@ -1867,11 +1867,11 @@
   while (popup_activated_flag)
     {
       NSTimer *tmo = nil;
-      EMACS_TIME next_time = timer_check ();
+      struct timespec next_time = timer_check ();
 
-      if (EMACS_TIME_VALID_P (next_time))
+      if (timespec_valid_p (next_time))
         {
-          double time = EMACS_TIME_TO_DOUBLE (next_time);
+          double time = timespectod (next_time);
           tmo = [NSTimer timerWithTimeInterval: time
                                         target: self
                                       selector: @selector (timeout_handler:)

=== modified file 'src/nsterm.h'
--- a/src/nsterm.h      2013-08-27 04:23:54 +0000
+++ b/src/nsterm.h      2013-08-27 18:47:55 +0000
@@ -872,7 +872,7 @@
 /* This in nsterm.m */
 extern void x_destroy_window (struct frame *f);
 extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds,
-                     fd_set *exceptfds, EMACS_TIME const *timeout,
+                     fd_set *exceptfds, struct timespec const *timeout,
                      sigset_t const *sigmask);
 extern unsigned long ns_get_rgb_color (struct frame *f,
                                        float r, float g, float b, float a);

=== modified file 'src/nsterm.m'
--- a/src/nsterm.m      2013-08-27 03:52:21 +0000
+++ b/src/nsterm.m      2013-08-27 18:47:55 +0000
@@ -214,7 +214,7 @@
 static fd_set select_readfds, select_writefds;
 enum { SELECT_HAVE_READ = 1, SELECT_HAVE_WRITE = 2, SELECT_HAVE_TMO = 4 };
 static int select_nfds = 0, select_valid = 0;
-static EMACS_TIME select_timeout = { 0, 0 };
+static struct timespec select_timeout = { 0, 0 };
 static int selfds[2] = { -1, -1 };
 static pthread_mutex_t select_mutex;
 static int apploopnr = 0;
@@ -485,16 +485,16 @@
      Blocking timer utility used by ns_ring_bell
    -------------------------------------------------------------------------- 
*/
 {
-  EMACS_TIME wakeup = add_emacs_time (current_emacs_time (),
-                                     make_emacs_time (0, usecs * 1000));
+  struct timespec wakeup = timespec_add (current_timespec (),
+                                        make_timespec (0, usecs * 1000));
 
   /* Keep waiting until past the time wakeup.  */
   while (1)
     {
-      EMACS_TIME timeout, now = current_emacs_time ();
-      if (EMACS_TIME_LE (wakeup, now))
+      struct timespec timeout, now = current_timespec ();
+      if (timespec_cmp (wakeup, now) <= 0)
        break;
-      timeout = sub_emacs_time (wakeup, now);
+      timeout = timespec_sub (wakeup, now);
 
       /* Try to wait that long--but we might wake up sooner.  */
       pselect (0, NULL, NULL, NULL, &timeout, NULL);
@@ -3529,7 +3529,7 @@
 
 int
 ns_select (int nfds, fd_set *readfds, fd_set *writefds,
-          fd_set *exceptfds, EMACS_TIME const *timeout,
+          fd_set *exceptfds, struct timespec const *timeout,
           sigset_t const *sigmask)
 /* --------------------------------------------------------------------------
      Replacement for select, checking for events
@@ -3600,7 +3600,7 @@
   else if (nr == 0 && timeout)
     {
       /* No file descriptor, just a timeout, no need to wake fd_handler  */
-      double time = EMACS_TIME_TO_DOUBLE (*timeout);
+      double time = timespectod (*timeout);
       timed_entry = [[NSTimer scheduledTimerWithTimeInterval: time
                                                       target: NSApp
                                                     selector:
@@ -4687,7 +4687,7 @@
   char c;
 
   SELECT_TYPE readfds, writefds, *wfds;
-  EMACS_TIME timeout, *tmo;
+  struct timespec timeout, *tmo;
   NSAutoreleasePool *pool = nil;
 
   /* NSTRACE (fd_handler); */

=== modified file 'src/process.c'
--- a/src/process.c     2013-08-24 02:23:34 +0000
+++ b/src/process.c     2013-08-27 18:47:55 +0000
@@ -133,7 +133,7 @@
 
 #ifdef WINDOWSNT
 extern int sys_select (int, SELECT_TYPE *, SELECT_TYPE *, SELECT_TYPE *,
-                      EMACS_TIME *, void *);
+                      struct timespec *, void *);
 #endif
 
 #ifndef SOCK_CLOEXEC
@@ -261,7 +261,7 @@
 #endif
 
 #ifdef ADAPTIVE_READ_BUFFERING
-#define READ_OUTPUT_DELAY_INCREMENT (EMACS_TIME_RESOLUTION / 100)
+#define READ_OUTPUT_DELAY_INCREMENT (TIMESPEC_RESOLUTION / 100)
 #define READ_OUTPUT_DELAY_MAX       (READ_OUTPUT_DELAY_INCREMENT * 5)
 #define READ_OUTPUT_DELAY_MAX_MAX   (READ_OUTPUT_DELAY_INCREMENT * 7)
 
@@ -3932,9 +3932,9 @@
        {
          if (XFLOAT_DATA (seconds) > 0)
            {
-             EMACS_TIME t = EMACS_TIME_FROM_DOUBLE (XFLOAT_DATA (seconds));
-             secs = min (EMACS_SECS (t), WAIT_READING_MAX);
-             nsecs = EMACS_NSECS (t);
+             struct timespec t = dtotimespec (XFLOAT_DATA (seconds));
+             secs = min (t.tv_sec, WAIT_READING_MAX);
+             nsecs = t.tv_nsec;
            }
        }
       else
@@ -4239,7 +4239,7 @@
   bool no_avail;
   int xerrno;
   Lisp_Object proc;
-  EMACS_TIME timeout, end_time;
+  struct timespec timeout, end_time;
   int wait_channel = -1;
   bool got_some_input = 0;
   ptrdiff_t count = SPECPDL_INDEX ();
@@ -4272,8 +4272,8 @@
      compute the absolute time to return at.  */
   if (time_limit || nsecs > 0)
     {
-      timeout = make_emacs_time (time_limit, nsecs);
-      end_time = add_emacs_time (current_emacs_time (), timeout);
+      timeout = make_timespec (time_limit, nsecs);
+      end_time = timespec_add (current_timespec (), timeout);
     }
 
   while (1)
@@ -4300,18 +4300,18 @@
             gobble output available now
             but don't wait at all. */
 
-         timeout = make_emacs_time (0, 0);
+         timeout = make_timespec (0, 0);
        }
       else if (time_limit || nsecs > 0)
        {
-         EMACS_TIME now = current_emacs_time ();
-         if (EMACS_TIME_LE (end_time, now))
+         struct timespec now = current_timespec ();
+         if (timespec_cmp (end_time, now) <= 0)
            break;
-         timeout = sub_emacs_time (end_time, now);
+         timeout = timespec_sub (end_time, now);
        }
       else
        {
-         timeout = make_emacs_time (100000, 0);
+         timeout = make_timespec (100000, 0);
        }
 
       /* Normally we run timers here.
@@ -4321,7 +4321,7 @@
       if (NILP (wait_for_cell)
          && just_wait_proc >= 0)
        {
-         EMACS_TIME timer_delay;
+         struct timespec timer_delay;
 
          do
            {
@@ -4356,9 +4356,9 @@
          /* A negative timeout means do not wait at all.  */
          if (nsecs >= 0)
            {
-             if (EMACS_TIME_VALID_P (timer_delay))
+             if (timespec_valid_p (timer_delay))
                {
-                 if (EMACS_TIME_LT (timer_delay, timeout))
+                 if (timespec_cmp (timer_delay, timeout) < 0)
                    {
                      timeout = timer_delay;
                      timeout_reduced_for_timers = 1;
@@ -4396,7 +4396,7 @@
             Atemp = input_wait_mask;
          Ctemp = write_mask;
 
-         timeout = make_emacs_time (0, 0);
+         timeout = make_timespec (0, 0);
          if ((pselect (max (max_process_desc, max_input_desc) + 1,
                        &Atemp,
 #ifdef NON_BLOCKING_CONNECT
@@ -4518,8 +4518,8 @@
             Vprocess_adaptive_read_buffering is nil.  */
          if (process_output_skip && check_delay > 0)
            {
-             int nsecs = EMACS_NSECS (timeout);
-             if (EMACS_SECS (timeout) > 0 || nsecs > READ_OUTPUT_DELAY_MAX)
+             int nsecs = timeout.tv_nsec;
+             if (timeout.tv_sec > 0 || nsecs > READ_OUTPUT_DELAY_MAX)
                nsecs = READ_OUTPUT_DELAY_MAX;
              for (channel = 0; check_delay > 0 && channel <= max_process_desc; 
channel++)
                {
@@ -4539,7 +4539,7 @@
                        nsecs = XPROCESS (proc)->read_output_delay;
                    }
                }
-             timeout = make_emacs_time (0, nsecs);
+             timeout = make_timespec (0, nsecs);
              process_output_skip = 0;
            }
 #endif
@@ -6543,7 +6543,7 @@
 
 /* Defined on msdos.c.  */
 extern int sys_select (int, SELECT_TYPE *, SELECT_TYPE *, SELECT_TYPE *,
-                      EMACS_TIME *, void *);
+                      struct timespec *, void *);
 
 /* Implementation of wait_reading_process_output, assuming that there
    are no subprocesses.  Used only by the MS-DOS build.
@@ -6582,7 +6582,7 @@
                             struct Lisp_Process *wait_proc, int just_wait_proc)
 {
   register int nfds;
-  EMACS_TIME end_time, timeout;
+  struct timespec end_time, timeout;
 
   if (time_limit < 0)
     {
@@ -6595,8 +6595,8 @@
   /* What does time_limit really mean?  */
   if (time_limit || nsecs > 0)
     {
-      timeout = make_emacs_time (time_limit, nsecs);
-      end_time = add_emacs_time (current_emacs_time (), timeout);
+      timeout = make_timespec (time_limit, nsecs);
+      end_time = timespec_add (current_timespec (), timeout);
     }
 
   /* Turn off periodic alarms (in case they are in use)
@@ -6629,18 +6629,18 @@
             gobble output available now
             but don't wait at all.  */
 
-         timeout = make_emacs_time (0, 0);
+         timeout = make_timespec (0, 0);
        }
       else if (time_limit || nsecs > 0)
        {
-         EMACS_TIME now = current_emacs_time ();
-         if (EMACS_TIME_LE (end_time, now))
+         struct timespec now = current_timespec ();
+         if (timespec_cmp (end_time, now) <= 0)
            break;
-         timeout = sub_emacs_time (end_time, now);
+         timeout = timespec_sub (end_time, now);
        }
       else
        {
-         timeout = make_emacs_time (100000, 0);
+         timeout = make_timespec (100000, 0);
        }
 
       /* If our caller will not immediately handle keyboard events,
@@ -6649,7 +6649,7 @@
         call timer_delay on their own.)  */
       if (NILP (wait_for_cell))
        {
-         EMACS_TIME timer_delay;
+         struct timespec timer_delay;
 
          do
            {
@@ -6669,9 +6669,9 @@
              && requeued_events_pending_p ())
            break;
 
-         if (EMACS_TIME_VALID_P (timer_delay) && nsecs >= 0)
+         if (timespec_valid_p (timer_delay) && nsecs >= 0)
            {
-             if (EMACS_TIME_LT (timer_delay, timeout))
+             if (timespec_cmp (timer_delay, timeout) < 0)
                {
                  timeout = timer_delay;
                  timeout_reduced_for_timers = 1;

=== modified file 'src/profiler.c'
--- a/src/profiler.c    2013-07-10 23:23:57 +0000
+++ b/src/profiler.c    2013-08-27 18:47:55 +0000
@@ -267,8 +267,8 @@
     return NOT_RUNNING;
 
   current_sampling_interval = XINT (sampling_interval);
-  interval = make_emacs_time (current_sampling_interval / billion,
-                             current_sampling_interval % billion);
+  interval = make_timespec (current_sampling_interval / billion,
+                           current_sampling_interval % billion);
   emacs_sigaction_init (&action, deliver_profiler_signal);
   sigaction (SIGPROF, &action, 0);
 

=== modified file 'src/sysdep.c'
--- a/src/sysdep.c      2013-08-24 02:23:34 +0000
+++ b/src/sysdep.c      2013-08-27 18:47:55 +0000
@@ -306,7 +306,7 @@
   /* If successful and status is requested, tell wait_reading_process_output
      that it needs to wake up and look around.  */
   if (pid && status && input_available_clear_time)
-    *input_available_clear_time = make_emacs_time (0, 0);
+    *input_available_clear_time = make_timespec (0, 0);
 
   return pid;
 }
@@ -2021,8 +2021,8 @@
 void
 init_random (void)
 {
-  EMACS_TIME t = current_emacs_time ();
-  uintmax_t v = getpid () ^ EMACS_SECS (t) ^ EMACS_NSECS (t);
+  struct timespec t = current_timespec ();
+  uintmax_t v = getpid () ^ t.tv_sec ^ t.tv_nsec;
   seed_random (&v, sizeof v);
 }
 
@@ -2357,7 +2357,7 @@
    Use the least timeval not less than T.
    Return an extremal value if the result would overflow.  */
 struct timeval
-make_timeval (EMACS_TIME t)
+make_timeval (struct timespec t)
 {
   struct timeval tv;
   tv.tv_sec = t.tv_sec;
@@ -2384,7 +2384,7 @@
    If FD is nonnegative, then FILE can be NULL.  */
 int
 set_file_times (int fd, const char *filename,
-               EMACS_TIME atime, EMACS_TIME mtime)
+               struct timespec atime, struct timespec mtime)
 {
   struct timespec timespec[2];
   timespec[0] = atime;
@@ -2701,7 +2701,7 @@
 #endif /* !defined (WINDOWSNT) */
 
 #if defined GNU_LINUX && defined HAVE_LONG_LONG_INT
-static EMACS_TIME
+static struct timespec
 time_from_jiffies (unsigned long long tval, long hz)
 {
   unsigned long long s = tval / hz;
@@ -2710,34 +2710,34 @@
 
   if (TYPE_MAXIMUM (time_t) < s)
     time_overflow ();
-  if (LONG_MAX - 1 <= ULLONG_MAX / EMACS_TIME_RESOLUTION
-      || frac <= ULLONG_MAX / EMACS_TIME_RESOLUTION)
-    ns = frac * EMACS_TIME_RESOLUTION / hz;
+  if (LONG_MAX - 1 <= ULLONG_MAX / TIMESPEC_RESOLUTION
+      || frac <= ULLONG_MAX / TIMESPEC_RESOLUTION)
+    ns = frac * TIMESPEC_RESOLUTION / hz;
   else
     {
       /* This is reachable only in the unlikely case that HZ * HZ
         exceeds ULLONG_MAX.  It calculates an approximation that is
         guaranteed to be in range.  */
-      long hz_per_ns = (hz / EMACS_TIME_RESOLUTION
-                       + (hz % EMACS_TIME_RESOLUTION != 0));
+      long hz_per_ns = (hz / TIMESPEC_RESOLUTION
+                       + (hz % TIMESPEC_RESOLUTION != 0));
       ns = frac / hz_per_ns;
     }
 
-  return make_emacs_time (s, ns);
+  return make_timespec (s, ns);
 }
 
 static Lisp_Object
 ltime_from_jiffies (unsigned long long tval, long hz)
 {
-  EMACS_TIME t = time_from_jiffies (tval, hz);
+  struct timespec t = time_from_jiffies (tval, hz);
   return make_lisp_time (t);
 }
 
-static EMACS_TIME
+static struct timespec
 get_up_time (void)
 {
   FILE *fup;
-  EMACS_TIME up = make_emacs_time (0, 0);
+  struct timespec up = make_timespec (0, 0);
 
   block_input ();
   fup = emacs_fopen ("/proc/uptime", "r");
@@ -2755,18 +2755,18 @@
          if (TYPE_MAXIMUM (time_t) < upsec)
            {
              upsec = TYPE_MAXIMUM (time_t);
-             upfrac = EMACS_TIME_RESOLUTION - 1;
+             upfrac = TIMESPEC_RESOLUTION - 1;
            }
          else
            {
              int upfraclen = upfrac_end - upfrac_start;
-             for (; upfraclen < LOG10_EMACS_TIME_RESOLUTION; upfraclen++)
+             for (; upfraclen < LOG10_TIMESPEC_RESOLUTION; upfraclen++)
                upfrac *= 10;
-             for (; LOG10_EMACS_TIME_RESOLUTION < upfraclen; upfraclen--)
+             for (; LOG10_TIMESPEC_RESOLUTION < upfraclen; upfraclen--)
                upfrac /= 10;
-             upfrac = min (upfrac, EMACS_TIME_RESOLUTION - 1);
+             upfrac = min (upfrac, TIMESPEC_RESOLUTION - 1);
            }
-         up = make_emacs_time (upsec, upfrac);
+         up = make_timespec (upsec, upfrac);
        }
       fclose (fup);
     }
@@ -2887,7 +2887,7 @@
   unsigned long long u_time, s_time, cutime, cstime, start;
   long priority, niceness, rss;
   unsigned long minflt, majflt, cminflt, cmajflt, vsize;
-  EMACS_TIME tnow, tstart, tboot, telapsed, us_time;
+  struct timespec tnow, tstart, tboot, telapsed, us_time;
   double pcpu, pmem;
   Lisp_Object attrs = Qnil;
   Lisp_Object cmd_str, decoded_cmd;
@@ -3008,20 +3008,19 @@
          attrs = Fcons (Fcons (Qnice, make_number (niceness)), attrs);
          attrs = Fcons (Fcons (Qthcount, make_fixnum_or_float (thcount)),
                         attrs);
-         tnow = current_emacs_time ();
+         tnow = current_timespec ();
          telapsed = get_up_time ();
-         tboot = sub_emacs_time (tnow, telapsed);
+         tboot = timespec_sub (tnow, telapsed);
          tstart = time_from_jiffies (start, clocks_per_sec);
-         tstart = add_emacs_time (tboot, tstart);
+         tstart = timespec_add (tboot, tstart);
          attrs = Fcons (Fcons (Qstart, make_lisp_time (tstart)), attrs);
          attrs = Fcons (Fcons (Qvsize, make_fixnum_or_float (vsize / 1024)),
                         attrs);
          attrs = Fcons (Fcons (Qrss, make_fixnum_or_float (4 * rss)), attrs);
-         telapsed = sub_emacs_time (tnow, tstart);
+         telapsed = timespec_sub (tnow, tstart);
          attrs = Fcons (Fcons (Qetime, make_lisp_time (telapsed)), attrs);
          us_time = time_from_jiffies (u_time + s_time, clocks_per_sec);
-         pcpu = (EMACS_TIME_TO_DOUBLE (us_time)
-                 / EMACS_TIME_TO_DOUBLE (telapsed));
+         pcpu = timespectod (us_time) / timespectod (telapsed);
          if (pcpu > 1.0)
            pcpu = 1.0;
          attrs = Fcons (Fcons (Qpcpu, make_float (100 * pcpu)), attrs);
@@ -3239,16 +3238,16 @@
 
 #elif defined __FreeBSD__
 
-static EMACS_TIME
-timeval_to_EMACS_TIME (struct timeval t)
+static struct timespec
+timeval_to_timespec (struct timeval t)
 {
-  return make_emacs_time (t.tv_sec, t.tv_usec * 1000);
+  return make_timespec (t.tv_sec, t.tv_usec * 1000);
 }
 
 static Lisp_Object
 make_lisp_timeval (struct timeval t)
 {
-  return make_lisp_time (timeval_to_EMACS_TIME (t));
+  return make_lisp_time (timeval_to_timespec (t));
 }
 
 Lisp_Object
@@ -3263,7 +3262,7 @@
   char *ttyname;
   size_t len;
   char args[MAXPATHLEN];
-  EMACS_TIME t, now;
+  struct timespec t, now;
 
   int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID};
   struct kinfo_proc proc;
@@ -3350,8 +3349,8 @@
                 attrs);
   attrs = Fcons (Fcons (Qstime, make_lisp_timeval (proc.ki_rusage.ru_stime)),
                 attrs);
-  t = add_emacs_time (timeval_to_EMACS_TIME (proc.ki_rusage.ru_utime),
-                     timeval_to_EMACS_TIME (proc.ki_rusage.ru_stime));
+  t = timespec_add (timeval_to_timespec (proc.ki_rusage.ru_utime),
+                   timeval_to_timespec (proc.ki_rusage.ru_stime));
   attrs = Fcons (Fcons (Qtime, make_lisp_time (t)), attrs);
 
   attrs = Fcons (Fcons (Qcutime,
@@ -3360,8 +3359,8 @@
   attrs = Fcons (Fcons (Qcstime,
                        make_lisp_timeval (proc.ki_rusage_ch.ru_utime)),
                 attrs);
-  t = add_emacs_time (timeval_to_EMACS_TIME (proc.ki_rusage_ch.ru_utime),
-                     timeval_to_EMACS_TIME (proc.ki_rusage_ch.ru_stime));
+  t = timespec_add (timeval_to_timespec (proc.ki_rusage_ch.ru_utime),
+                   timeval_to_timespec (proc.ki_rusage_ch.ru_stime));
   attrs = Fcons (Fcons (Qctime, make_lisp_time (t)), attrs);
 
   attrs = Fcons (Fcons (Qthcount, make_fixnum_or_float (proc.ki_numthreads)),
@@ -3373,8 +3372,8 @@
   attrs = Fcons (Fcons (Qrss,   make_number (proc.ki_rssize * pagesize >> 10)),
                 attrs);
 
-  now = current_emacs_time ();
-  t = sub_emacs_time (now, timeval_to_EMACS_TIME (proc.ki_start));
+  now = current_timespec ();
+  t = timespec_sub (now, timeval_to_timespec (proc.ki_start));
   attrs = Fcons (Fcons (Qetime, make_lisp_time (t)), attrs);
 
   len = sizeof fscale;

=== modified file 'src/systime.h'
--- a/src/systime.h     2013-07-10 06:26:23 +0000
+++ b/src/systime.h     2013-08-27 18:47:55 +0000
@@ -46,140 +46,56 @@
 
 #include <sys/time.h>  /* for 'struct timeval' */
 
-/* The type to use to represent non-negative temporal intervals.  Its
-   address can be passed as the timeout argument to the pselect system
-   call.  */
-typedef struct timespec EMACS_TIME;
-
-/* Resolution of EMACS_TIME time stamps (in units per second), and log
-   base 10 of the resolution.  The log must be a positive integer.  */
-enum { EMACS_TIME_RESOLUTION = 1000000000 };
-enum { LOG10_EMACS_TIME_RESOLUTION = 9 };
-
-/* EMACS_SECS (TIME) is the seconds component of TIME.
-   EMACS_NSECS (TIME) is the nanoseconds component of TIME.
-   emacs_secs_addr (PTIME) is the address of *PTIME's seconds component.  */
-SYSTIME_INLINE time_t EMACS_SECS (EMACS_TIME t) { return t.tv_sec; }
-SYSTIME_INLINE int EMACS_NSECS (EMACS_TIME t) { return t.tv_nsec; }
-SYSTIME_INLINE time_t *emacs_secs_addr (EMACS_TIME *t) { return &t->tv_sec; }
-
-/* Return an Emacs time with seconds S and nanoseconds NS.  */
-SYSTIME_INLINE EMACS_TIME
-make_emacs_time (time_t s, int ns)
+/* Emacs uses struct timespec to represent nonnegative temporal intervals.
+
+   WARNING: Since tv_sec might be an unsigned value, do not use struct
+   timespec as a general-purpose data type for adding or subtracting
+   arbitrary time values!  When computing A + B or A - B, typically A
+   should be an absolute time since the epoch and B a nonnegative offset.  */
+
+/* Return an invalid timespec.  */
+SYSTIME_INLINE struct timespec
+invalid_timespec (void)
 {
-  EMACS_TIME r;
-  r.tv_sec = s;
-  r.tv_nsec = ns;
-  return r;
+  return make_timespec (0, -1);
 }
 
-/* Return an invalid Emacs time.  */
-SYSTIME_INLINE EMACS_TIME
-invalid_emacs_time (void)
+/* Return 1 if TIME is a valid timespec.  This currently doesn't worry
+   about whether tv_nsec is less than TIMESPEC_RESOLUTION; leap seconds
+   might cause a problem if it did.  */
+SYSTIME_INLINE int
+timespec_valid_p (struct timespec t)
 {
-  EMACS_TIME r;
-  r.tv_sec = 0;
-  r.tv_nsec = -1;
-  return r;
+  return t.tv_nsec >= 0;
 }
 
 /* Return current system time.  */
-SYSTIME_INLINE EMACS_TIME
-current_emacs_time (void)
+SYSTIME_INLINE struct timespec
+current_timespec (void)
 {
-  EMACS_TIME r;
+  struct timespec r;
   gettime (&r);
   return r;
 }
 
-/* Return the result of adding A to B, or of subtracting B from A.
-   On overflow, store an extremal value: ergo, if time_t is unsigned,
-   return 0 if the true answer would be negative.
-
-   WARNING: These are NOT general-purpose macros for adding or
-   subtracting arbitrary time values!  They are generally intended to
-   be used with their first argument an absolute time since the epoch
-   and the second argument a non-negative offset.  Do NOT use them for
-   anything else.  */
-SYSTIME_INLINE EMACS_TIME
-add_emacs_time (EMACS_TIME a, EMACS_TIME b)
-{
-  return timespec_add (a, b);
-}
-SYSTIME_INLINE EMACS_TIME
-sub_emacs_time (EMACS_TIME a, EMACS_TIME b)
-{
-  return timespec_sub (a, b);
-}
-
-/* Return the sign of the valid time stamp TIME, either -1, 0, or 1.
-   Note: this can only return a negative value if time_t is a signed
-   data type.  */
-SYSTIME_INLINE int
-EMACS_TIME_SIGN (EMACS_TIME t)
-{
-  return timespec_sign (t);
-}
-
-/* Return 1 if TIME is a valid time stamp.  */
-SYSTIME_INLINE int
-EMACS_TIME_VALID_P (EMACS_TIME t)
-{
-  return t.tv_nsec >= 0;
-}
-
-/* Convert the double D to the greatest EMACS_TIME not greater than D.
-   On overflow, return an extremal value; in particular, if time_t is
-   an unsigned data type and D is negative, return zero.  Return the
-   minimum EMACS_TIME if D is not a number.  */
-SYSTIME_INLINE EMACS_TIME
-EMACS_TIME_FROM_DOUBLE (double d)
-{
-  return dtotimespec (d);
-}
-
-/* Convert the Emacs time T to an approximate double value D.  */
-SYSTIME_INLINE double
-EMACS_TIME_TO_DOUBLE (EMACS_TIME t)
-{
-  return timespectod (t);
-}
-
 /* defined in sysdep.c */
-extern int set_file_times (int, const char *, EMACS_TIME, EMACS_TIME);
-extern struct timeval make_timeval (EMACS_TIME) ATTRIBUTE_CONST;
+extern int set_file_times (int, const char *, struct timespec, struct 
timespec);
+extern struct timeval make_timeval (struct timespec) ATTRIBUTE_CONST;
 
 /* defined in keyboard.c */
-extern void set_waiting_for_input (EMACS_TIME *);
+extern void set_waiting_for_input (struct timespec *);
 
 /* When lisp.h is not included Lisp_Object is not defined (this can
    happen when this files is used outside the src directory).
    Use GCPRO1 to determine if lisp.h was included.  */
 #ifdef GCPRO1
 /* defined in editfns.c */
-extern Lisp_Object make_lisp_time (EMACS_TIME);
+extern Lisp_Object make_lisp_time (struct timespec);
 extern bool decode_time_components (Lisp_Object, Lisp_Object, Lisp_Object,
-                                   Lisp_Object, EMACS_TIME *, double *);
-extern EMACS_TIME lisp_time_argument (Lisp_Object);
+                                   Lisp_Object, struct timespec *, double *);
+extern struct timespec lisp_time_argument (Lisp_Object);
 #endif
 
-/* Compare times T1 and T2 for equality, inequality etc.  */
-SYSTIME_INLINE int
-EMACS_TIME_EQ (EMACS_TIME t1, EMACS_TIME t2)
-{
-  return timespec_cmp (t1, t2) == 0;
-}
-SYSTIME_INLINE int
-EMACS_TIME_LT (EMACS_TIME t1, EMACS_TIME t2)
-{
-  return timespec_cmp (t1, t2) < 0;
-}
-SYSTIME_INLINE int
-EMACS_TIME_LE (EMACS_TIME t1, EMACS_TIME t2)
-{
-  return timespec_cmp (t1, t2) <= 0;
-}
-
 INLINE_HEADER_END
 
 #endif /* EMACS_SYSTIME_H */

=== modified file 'src/w32.c'
--- a/src/w32.c 2013-08-24 10:15:01 +0000
+++ b/src/w32.c 2013-08-27 18:47:55 +0000
@@ -247,7 +247,7 @@
 extern int sys_access (const char *, int);
 extern void *e_malloc (size_t);
 extern int sys_select (int, SELECT_TYPE *, SELECT_TYPE *, SELECT_TYPE *,
-                      EMACS_TIME *, void *);
+                      struct timespec *, void *);
 extern int sys_dup (int);
 
 
@@ -7939,7 +7939,7 @@
 {
   int n, err;
   SELECT_TYPE fdset;
-  EMACS_TIME timeout;
+  struct timespec timeout;
   struct Lisp_Process *process = (struct Lisp_Process *)p;
   int fd = process->infd;
 

=== modified file 'src/w32proc.c'
--- a/src/w32proc.c     2013-02-25 17:36:03 +0000
+++ b/src/w32proc.c     2013-08-27 18:47:55 +0000
@@ -1916,7 +1916,7 @@
 
 int
 sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
-           EMACS_TIME *timeout, void *ignored)
+           struct timespec *timeout, void *ignored)
 {
   SELECT_TYPE orfds;
   DWORD timeout_ms, start_time;

=== modified file 'src/xdisp.c'
--- a/src/xdisp.c       2013-08-27 03:52:21 +0000
+++ b/src/xdisp.c       2013-08-27 18:47:55 +0000
@@ -29800,20 +29800,20 @@
 start_hourglass (void)
 {
 #if defined (HAVE_WINDOW_SYSTEM)
-  EMACS_TIME delay;
+  struct timespec delay;
 
   cancel_hourglass ();
 
   if (INTEGERP (Vhourglass_delay)
       && XINT (Vhourglass_delay) > 0)
-    delay = make_emacs_time (min (XINT (Vhourglass_delay),
+    delay = make_timespec (min (XINT (Vhourglass_delay),
                                  TYPE_MAXIMUM (time_t)),
-                            0);
+                          0);
   else if (FLOATP (Vhourglass_delay)
           && XFLOAT_DATA (Vhourglass_delay) > 0)
-    delay = EMACS_TIME_FROM_DOUBLE (XFLOAT_DATA (Vhourglass_delay));
+    delay = dtotimespec (XFLOAT_DATA (Vhourglass_delay));
   else
-    delay = make_emacs_time (DEFAULT_HOURGLASS_DELAY, 0);
+    delay = make_timespec (DEFAULT_HOURGLASS_DELAY, 0);
 
 #ifdef HAVE_NTGUI
   {

=== modified file 'src/xgselect.c'
--- a/src/xgselect.c    2013-08-26 21:31:50 +0000
+++ b/src/xgselect.c    2013-08-27 18:47:55 +0000
@@ -25,15 +25,16 @@
 
 #include <glib.h>
 #include <errno.h>
+#include <timespec.h>
 #include "frame.h"
 
 int
 xg_select (int fds_lim, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE 
*efds,
-          EMACS_TIME const *timeout, sigset_t const *sigmask)
+          struct timespec const *timeout, sigset_t const *sigmask)
 {
   SELECT_TYPE all_rfds, all_wfds;
-  EMACS_TIME tmo;
-  EMACS_TIME const *tmop = timeout;
+  struct timespec tmo;
+  struct timespec const *tmop = timeout;
 
   GMainContext *context;
   int have_wfds = wfds != NULL;
@@ -86,9 +87,9 @@
 
   if (tmo_in_millisec >= 0)
     {
-      tmo = make_emacs_time (tmo_in_millisec / 1000,
-                            1000 * 1000 * (tmo_in_millisec % 1000));
-      if (!timeout || EMACS_TIME_LT (tmo, *timeout))
+      tmo = make_timespec (tmo_in_millisec / 1000,
+                          1000 * 1000 * (tmo_in_millisec % 1000));
+      if (!timeout || timespec_cmp (tmo, *timeout) < 0)
        tmop = &tmo;
     }
 

=== modified file 'src/xgselect.h'
--- a/src/xgselect.h    2013-08-26 21:31:50 +0000
+++ b/src/xgselect.h    2013-08-27 18:47:55 +0000
@@ -21,14 +21,14 @@
 #define XGSELECT_H
 
 #include "lisp.h"
-#include "systime.h"
+#include <time.h>
 #include "sysselect.h"
 
 extern int xg_select (int max_fds,
                       SELECT_TYPE *rfds,
                       SELECT_TYPE *wfds,
                       SELECT_TYPE *efds,
-                     EMACS_TIME const *timeout,
+                     struct timespec const *timeout,
                      sigset_t const *sigmask);
 
 #endif /* XGSELECT_H */

=== modified file 'src/xmenu.c'
--- a/src/xmenu.c       2013-08-11 01:30:20 +0000
+++ b/src/xmenu.c       2013-08-27 18:47:55 +0000
@@ -377,7 +377,7 @@
 #endif
          )
     {
-      EMACS_TIME next_time = timer_check (), *ntp;
+      struct timespec next_time = timer_check (), *ntp;
       SELECT_TYPE read_fds;
       struct x_display_info *dpyinfo;
       int n = 0;
@@ -391,7 +391,7 @@
           XFlush (dpyinfo->display);
         }
 
-      if (! EMACS_TIME_VALID_P (next_time))
+      if (! timespec_valid_p (next_time))
         ntp = 0;
       else
         ntp = &next_time;

=== modified file 'src/xterm.c'
--- a/src/xterm.c       2013-08-27 03:52:21 +0000
+++ b/src/xterm.c       2013-08-27 18:47:55 +0000
@@ -3112,22 +3112,22 @@
       x_flush (f);
 
       {
-       EMACS_TIME delay = make_emacs_time (0, 150 * 1000 * 1000);
-       EMACS_TIME wakeup = add_emacs_time (current_emacs_time (), delay);
+       struct timespec delay = make_timespec (0, 150 * 1000 * 1000);
+       struct timespec wakeup = timespec_add (current_timespec (), delay);
 
        /* Keep waiting until past the time wakeup or any input gets
           available.  */
        while (! detect_input_pending ())
          {
-           EMACS_TIME current = current_emacs_time ();
-           EMACS_TIME timeout;
+           struct timespec current = current_timespec ();
+           struct timespec timeout;
 
            /* Break if result would not be positive.  */
-           if (EMACS_TIME_LE (wakeup, current))
+           if (timespec_cmp (wakeup, current) <= 0)
              break;
 
            /* How long `select' should wait.  */
-           timeout = make_emacs_time (0, 10 * 1000 * 1000);
+           timeout = make_timespec (0, 10 * 1000 * 1000);
 
            /* Try to wait that long--but we might wake up sooner.  */
            pselect (0, NULL, NULL, NULL, &timeout, NULL);
@@ -8677,7 +8677,7 @@
   int level = interrupt_input_blocked;
 
   SELECT_TYPE fds;
-  EMACS_TIME tmo, tmo_at, time_now;
+  struct timespec tmo, tmo_at, time_now;
   int fd = ConnectionNumber (FRAME_X_DISPLAY (f));
 
   pending_event_wait.f = f;
@@ -8685,8 +8685,8 @@
 
   /* Set timeout to 0.1 second.  Hopefully not noticeable.
      Maybe it should be configurable.  */
-  tmo = make_emacs_time (0, 100 * 1000 * 1000);
-  tmo_at = add_emacs_time (current_emacs_time (), tmo);
+  tmo = make_timespec (0, 100 * 1000 * 1000);
+  tmo_at = timespec_add (current_timespec (), tmo);
 
   while (pending_event_wait.eventtype)
     {
@@ -8699,11 +8699,11 @@
       FD_ZERO (&fds);
       FD_SET (fd, &fds);
 
-      time_now = current_emacs_time ();
-      if (EMACS_TIME_LT (tmo_at, time_now))
+      time_now = current_timespec ();
+      if (timespec_cmp (tmo_at, time_now) < 0)
        break;
 
-      tmo = sub_emacs_time (tmo_at, time_now);
+      tmo = timespec_sub (tmo_at, time_now);
       if (pselect (fd + 1, &fds, NULL, NULL, &tmo, NULL) == 0)
         break; /* Timeout */
     }
@@ -10425,7 +10425,7 @@
   block_input ();
   if (!x_timeout_atimer_activated_flag)
     {
-      EMACS_TIME interval = make_emacs_time (0, 100 * 1000 * 1000);
+      struct timespec interval = make_timespec (0, 100 * 1000 * 1000);
       start_atimer (ATIMER_RELATIVE, interval, x_process_timeouts, 0);
       x_timeout_atimer_activated_flag = 1;
     }


reply via email to

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