38 #include "../util/io.h" |
38 #include "../util/io.h" |
39 |
39 |
40 #include "event.h" |
40 #include "event.h" |
41 #include "event_linux.h" |
41 #include "event_linux.h" |
42 |
42 |
|
43 #include "httprequest.h" |
|
44 |
43 |
45 |
44 EVHandler* evhandler_create(EventHandlerConfig *cfg) { |
46 EVHandler* evhandler_create(EventHandlerConfig *cfg) { |
45 EVHandler *ev = malloc(sizeof(EVHandler)); |
47 EVHandler *ev = malloc(sizeof(EVHandler)); |
46 ev->current = 0; |
48 ev->current = 0; |
47 ev->instances = calloc(cfg->nthreads, sizeof(void*)); |
49 ev->instances = calloc(cfg->nthreads, sizeof(void*)); |
99 log_ereport(LOG_FAILURE, "epoll_wait failed: %s", strerror(errno)); |
99 log_ereport(LOG_FAILURE, "epoll_wait failed: %s", strerror(errno)); |
100 continue; |
100 continue; |
101 } |
101 } |
102 |
102 |
103 int numfinished = 0; |
103 int numfinished = 0; |
|
104 ev->numret = 0; |
104 for(int i=0;i<ret;i++) { |
105 for(int i=0;i<ret;i++) { |
105 Event *event = events[i].data.ptr; |
106 Event *event = events[i].data.ptr; |
106 if(!event) { |
107 if(!event) { |
107 char ebuf[sizeof(Event*)]; |
108 char ebuf[sizeof(Event*)]; |
108 int ebufpos = 0; |
109 int ebufpos = 0; |
165 // call event finish handlers |
166 // call event finish handlers |
166 for(int i=0;i<numfinished;i++) { |
167 for(int i=0;i<numfinished;i++) { |
167 Event *event = finished[i]; |
168 Event *event = finished[i]; |
168 finished[i]->finish(ev, event); |
169 finished[i]->finish(ev, event); |
169 } |
170 } |
|
171 // execute return calls |
|
172 for(int i=0;i<ev->numret;i++) { |
|
173 EVReturn ret = ev->fnreturn[i]; |
|
174 nsapi_saf_return(ret.sn, ret.rq, ret.ret); |
|
175 } |
170 } |
176 } |
171 } |
177 } |
172 |
178 |
173 int ev_convert2sys_events(int events) { |
179 int ev_convert2sys_events(int events) { |
174 int e = EPOLLET; |
180 int e = EPOLLET; |
242 } |
248 } |
243 |
249 |
244 int event_removepoll(EventHandler *ev, SYS_NETFD fd) { |
250 int event_removepoll(EventHandler *ev, SYS_NETFD fd) { |
245 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL); |
251 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL); |
246 } |
252 } |
|
253 |
|
254 |
|
255 void ev_saf_return(EventHandler *h, Session *sn, Request *rq, int ret) { |
|
256 h->fnreturn[h->numret++] = (EVReturn){ sn, rq, ret }; |
|
257 } |