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