/* Asynchronous timers.
- Copyright (C) 2000-2013 Free Software Foundation, Inc.
+ Copyright (C) 2000-2014 Free Software Foundation, Inc.
This file is part of GNU Emacs.
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
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;
}
#ifdef HAVE_SETITIMER
struct itimerval it;
#endif
- EMACS_TIME now, interval;
+ struct timespec now, interval;
#ifdef HAVE_ITIMERSPEC
if (alarm_timer_ok)
/* 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
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 */
}
}
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. */
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;
if (t->type == ATIMER_CONTINUOUS)
{
- t->expiration = add_emacs_time (now, t->interval);
+ t->expiration = timespec_add (now, t->interval);
schedule_atimer (t);
}
else