src/server/daemon/event_linux.c

changeset 443
ef3c8a0e1fee
parent 193
aa8393527b1e
child 474
eb7640c59e9b
equal deleted inserted replaced
442:05c2b62448b1 443:ef3c8a0e1fee
44 EVHandler* evhandler_create(EventHandlerConfig *cfg) { 44 EVHandler* evhandler_create(EventHandlerConfig *cfg) {
45 EVHandler *ev = malloc(sizeof(EVHandler)); 45 EVHandler *ev = malloc(sizeof(EVHandler));
46 ev->current = 0; 46 ev->current = 0;
47 ev->instances = calloc(cfg->nthreads, sizeof(void*)); 47 ev->instances = calloc(cfg->nthreads, sizeof(void*));
48 ev->numins = cfg->nthreads; 48 ev->numins = cfg->nthreads;
49 49
50 for(int i=0;i<cfg->nthreads;i++) { 50 for(int i=0;i<cfg->nthreads;i++) {
51 EventHandler *handler = malloc(sizeof(EventHandler)); 51 EventHandler *handler = malloc(sizeof(EventHandler));
52 ev->instances[i] = handler; 52 ev->instances[i] = handler;
53 53
54 handler->ep = epoll_create(64); 54 handler->ep = epoll_create(64);
55 if(handler->ep == 0) { 55 if(handler->ep < 0) {
56 // TODO: error 56 log_ereport(LOG_FAILURE, "evhandler_create: epoll_create: %s", strerror(errno));
57 return NULL; 57 return NULL;
58 } 58 }
59 59
60 int eventpipe[2]; 60 int eventpipe[2];
61 if(pipe(eventpipe)) { 61 if(pipe(eventpipe)) {
62 log_ereport(LOG_FAILURE, "evhandler_create: pipe: %s", strerror(errno));
62 return NULL; 63 return NULL;
63 } 64 }
64 handler->eventin = eventpipe[0]; 65 handler->eventin = eventpipe[0];
65 handler->eventout = eventpipe[1]; 66 handler->eventout = eventpipe[1];
66 67
67 struct epoll_event epev; 68 struct epoll_event epev;
68 epev.events = EPOLLIN | EPOLLET; // input event, edge triggered 69 epev.events = EPOLLIN | EPOLLET; // input event, edge triggered
69 epev.data.ptr = NULL; 70 epev.data.ptr = NULL;
70 if(epoll_ctl(handler->ep, EPOLL_CTL_ADD, handler->eventin, &epev)) { 71 if(epoll_ctl(handler->ep, EPOLL_CTL_ADD, handler->eventin, &epev)) {
72 log_ereport("evhandler_create: epoll_ctl: %s", strerror(errno));
71 return NULL; 73 return NULL;
72 } 74 }
73 75
74 SYS_THREAD t = systhread_start( 76 SYS_THREAD t = systhread_start(
75 0, 77 0,
76 0, 78 0,
77 (thrstartfunc)ev_handle_events, 79 (thrstartfunc)ev_handle_events,
78 handler); 80 handler);
79 systhread_detach(t); 81 systhread_detach(t);
80 } 82 }
81 83
82 return ev; 84 return ev;
83 } 85 }
84 86
85 87

mercurial