forked from clostra/newnode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimer.c
52 lines (44 loc) · 1.12 KB
/
timer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdlib.h>
#include <assert.h>
#include "timer.h"
void timer_free(timer *t)
{
assert(!evtimer_pending(&t->event, NULL));
Block_release(t->cb);
free(t);
}
void evtimer_callback(evutil_socket_t fd, short events, void *arg)
{
timer *t = (timer*)arg;
t->cb();
if (!(event_get_events(&t->event) & EV_PERSIST)) {
timer_free(t);
}
}
void timer_cancel(timer *t)
{
evtimer_del(&t->event);
timer_free(t);
}
timer* timer_new(network *n, uint64_t timeout_ms, short events, timer_callback cb)
{
timeval timeout;
timeout.tv_sec = timeout_ms / 1000;
timeout.tv_usec = (timeout_ms % 1000) * 1000;
timer *t = alloc(timer);
t->cb = Block_copy(cb);
if (event_assign(&t->event, n->evbase, -1, events, evtimer_callback, t)) {
timer_free(t);
return NULL;
}
evtimer_add(&t->event, &timeout);
return t;
}
timer* timer_start(network *n, uint64_t timeout_ms, timer_callback cb)
{
return timer_new(n, timeout_ms, 0, cb);
}
timer* timer_repeating(network *n, uint64_t timeout_ms, timer_callback cb)
{
return timer_new(n, timeout_ms, EV_PERSIST, cb);
}