diff options
Diffstat (limited to 'common/loop.c')
-rw-r--r-- | common/loop.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/common/loop.c b/common/loop.c index bfbfd5a6..da3c2142 100644 --- a/common/loop.c +++ b/common/loop.c | |||
@@ -12,6 +12,7 @@ | |||
12 | struct loop_event { | 12 | struct loop_event { |
13 | void (*callback)(int fd, short mask, void *data); | 13 | void (*callback)(int fd, short mask, void *data); |
14 | void *data; | 14 | void *data; |
15 | bool is_timer; | ||
15 | }; | 16 | }; |
16 | 17 | ||
17 | struct loop { | 18 | struct loop { |
@@ -52,6 +53,11 @@ void loop_poll(struct loop *loop) { | |||
52 | 53 | ||
53 | if (pfd.revents & events) { | 54 | if (pfd.revents & events) { |
54 | event->callback(pfd.fd, pfd.revents, event->data); | 55 | event->callback(pfd.fd, pfd.revents, event->data); |
56 | |||
57 | if (event->is_timer) { | ||
58 | loop_remove_event(loop, event); | ||
59 | --i; | ||
60 | } | ||
55 | } | 61 | } |
56 | } | 62 | } |
57 | } | 63 | } |
@@ -82,11 +88,14 @@ struct loop_event *loop_add_timer(struct loop *loop, int ms, | |||
82 | struct itimerspec its; | 88 | struct itimerspec its; |
83 | its.it_interval.tv_sec = 0; | 89 | its.it_interval.tv_sec = 0; |
84 | its.it_interval.tv_nsec = 0; | 90 | its.it_interval.tv_nsec = 0; |
85 | its.it_value.tv_sec = ms / 1000000000; | 91 | its.it_value.tv_sec = ms / 1000; |
86 | its.it_value.tv_nsec = (ms * 1000000) % 1000000000; | 92 | its.it_value.tv_nsec = (ms % 1000) * 1000000; |
87 | timerfd_settime(fd, 0, &its, NULL); | 93 | timerfd_settime(fd, 0, &its, NULL); |
88 | 94 | ||
89 | return loop_add_fd(loop, fd, POLLIN, callback, data); | 95 | struct loop_event *event = loop_add_fd(loop, fd, POLLIN, callback, data); |
96 | event->is_timer = true; | ||
97 | |||
98 | return event; | ||
90 | } | 99 | } |
91 | 100 | ||
92 | bool loop_remove_event(struct loop *loop, struct loop_event *event) { | 101 | bool loop_remove_event(struct loop *loop, struct loop_event *event) { |
@@ -94,6 +103,10 @@ bool loop_remove_event(struct loop *loop, struct loop_event *event) { | |||
94 | if (loop->events->items[i] == event) { | 103 | if (loop->events->items[i] == event) { |
95 | list_del(loop->events, i); | 104 | list_del(loop->events, i); |
96 | 105 | ||
106 | if (event->is_timer) { | ||
107 | close(loop->fds[i].fd); | ||
108 | } | ||
109 | |||
97 | loop->fd_length--; | 110 | loop->fd_length--; |
98 | memmove(&loop->fds[i], &loop->fds[i + 1], sizeof(void*) * (loop->fd_length - i)); | 111 | memmove(&loop->fds[i], &loop->fds[i + 1], sizeof(void*) * (loop->fd_length - i)); |
99 | 112 | ||