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 |