1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
4 #include <event2/event.h>
5 #include <event2/event_compat.h>
6 #include <event2/event_struct.h>
7 #else
8 #include <event.h>
9 #endif
10 
11 #include <sys/time.h>
12 
13 #include "utils.h"
14 
15 #include "timer.h"
16 
17 struct CcnetTimer
18 {
19     struct event   event;
20     struct timeval tv;
21     TimerCB        func;
22     void          *user_data;
23     uint8_t        inCallback;
24 };
25 
26 static void
timer_callback(evutil_socket_t fd,short event,void * vtimer)27 timer_callback (evutil_socket_t fd, short event, void *vtimer)
28 {
29     int more;
30     struct CcnetTimer *timer = vtimer;
31 
32     timer->inCallback = 1;
33     more = (*timer->func) (timer->user_data);
34     timer->inCallback = 0;
35 
36     if (more)
37         evtimer_add (&timer->event, &timer->tv);
38     else
39         ccnet_timer_free (&timer);
40 }
41 
42 void
ccnet_timer_free(CcnetTimer ** ptimer)43 ccnet_timer_free (CcnetTimer **ptimer)
44 {
45     CcnetTimer *timer;
46 
47     /* zero out the argument passed in */
48     g_return_if_fail (ptimer);
49 
50     timer = *ptimer;
51     *ptimer = NULL;
52 
53     /* destroy the timer directly or via the command queue */
54     if (timer && !timer->inCallback)
55     {
56         event_del (&timer->event);
57         g_free (timer);
58     }
59 }
60 
61 CcnetTimer*
ccnet_timer_new(TimerCB func,void * user_data,uint64_t interval_milliseconds)62 ccnet_timer_new (TimerCB         func,
63                  void           *user_data,
64                  uint64_t        interval_milliseconds)
65 {
66     CcnetTimer *timer = g_new0 (CcnetTimer, 1);
67 
68     timer->tv = timeval_from_msec (interval_milliseconds);
69     timer->func = func;
70     timer->user_data = user_data;
71 
72     evtimer_set (&timer->event, timer_callback, timer);
73     evtimer_add (&timer->event, &timer->tv);
74 
75     return timer;
76 }
77