return (0);
}
+static int
+gettime(struct timeval *tp)
+{
+#ifdef HAVE_CLOCK_GETTIME
+ struct timespec ts;
+
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
+ return (-1);
+ tp->tv_sec = ts.tv_sec;
+ tp->tv_usec = ts.tv_nsec / 1000;
+#else
+ gettimeofday(tp, NULL);
+#endif
+
+ return (0);
+}
+
RB_PROTOTYPE(event_tree, event, ev_timeout_node, compare);
RB_GENERATE(event_tree, event, ev_timeout_node, compare);
event_sigcb = NULL;
event_gotsig = 0;
- gettimeofday(¤t_base->event_tv, NULL);
+ gettime(¤t_base->event_tv);
RB_INIT(¤t_base->timetree);
TAILQ_INIT(¤t_base->eventqueue);
}
/* Check if time is running backwards */
- gettimeofday(&tv, NULL);
+ gettime(&tv);
if (timercmp(&tv, &base->event_tv, <)) {
struct timeval off;
event_debug(("%s: time is running backwards, corrected",
int
event_pending(struct event *ev, short event, struct timeval *tv)
{
+ struct timeval now, res;
int flags = 0;
if (ev->ev_flags & EVLIST_INSERTED)
event &= (EV_TIMEOUT|EV_READ|EV_WRITE|EV_SIGNAL);
/* See if there is a timeout that we should report */
- if (tv != NULL && (flags & event & EV_TIMEOUT))
- *tv = ev->ev_timeout;
+ if (tv != NULL && (flags & event & EV_TIMEOUT)) {
+ gettime(&now);
+ timersub(&ev->ev_timeout, &now, &res);
+ gettime(&now);
+ timeradd(&now, &res, tv);
+ }
return (flags & event);
}
event_queue_remove(base, ev, EVLIST_ACTIVE);
}
- gettimeofday(&now, NULL);
+ gettime(&now);
timeradd(&now, tv, &ev->ev_timeout);
event_debug((
return (0);
}
- if (gettimeofday(&now, NULL) == -1)
+ if (gettime(&now) == -1)
return (-1);
if (timercmp(&ev->ev_timeout, &now, <=)) {
struct timeval now;
struct event *ev, *next;
- gettimeofday(&now, NULL);
+ gettime(&now);
for (ev = RB_MIN(event_tree, &base->timetree); ev; ev = next) {
if (timercmp(&ev->ev_timeout, &now, >))