[ifxmips]
[openwrt/svn-archive/archive.git] / package / libtapi / src / events.c
1 #include <stdbool.h>
2 #include <sys/epoll.h>
3 #include <stdlib.h>
4 #include <errno.h>
5
6 #include <stdio.h>
7
8 #include "events.h"
9
10 struct event_callback *event_callbacks;
11
12 static int event_epoll_fd = -1;
13
14 int event_register(int fd, int events, struct event_callback *cb)
15 {
16 struct epoll_event ev;
17
18 if (event_epoll_fd == -1)
19 event_epoll_fd = epoll_create(1);
20
21 ev.events = events;
22 ev.data.ptr = cb;
23
24 cb->fd = fd;
25
26 return epoll_ctl(event_epoll_fd, EPOLL_CTL_ADD, fd, &ev);
27 }
28
29 int event_unregister(int fd)
30 {
31 return epoll_ctl(event_epoll_fd, EPOLL_CTL_DEL, fd, NULL);
32 }
33
34 int tapi_mainloop(void)
35 {
36 struct epoll_event ev[10];
37 struct event_callback *cb;
38 int ret;
39 bool keep;
40 int i;
41
42 if (event_epoll_fd == -1)
43 event_epoll_fd = epoll_create(1);
44
45 while(true) {
46 ret = epoll_wait(event_epoll_fd, ev, 10, -1);
47 for(i = 0; i < ret; ++i) {
48 cb = ev[i].data.ptr;
49 keep = cb->callback(ev[i].events, cb->data);
50 if (!keep)
51 event_unregister(cb->fd);
52 }
53 if (ret < 0)
54 printf("epoll: %d\n", errno);
55 }
56
57 return 0;
58 }