32 #include "../util/atomic.h" |
32 #include "../util/atomic.h" |
33 #include "../util/io.h" |
33 #include "../util/io.h" |
34 |
34 |
35 #include "event_bsd.h" |
35 #include "event_bsd.h" |
36 |
36 |
|
37 #include "httprequest.h" |
|
38 |
37 EVHandler* evhandler_create(EventHandlerConfig *cfg) { |
39 EVHandler* evhandler_create(EventHandlerConfig *cfg) { |
38 EVHandler *ev = malloc(sizeof(EVHandler)); |
40 EVHandler *ev = malloc(sizeof(EVHandler)); |
39 ev->current = 0; |
41 ev->current = 0; |
40 ev->instances = calloc(cfg->nthreads, sizeof(void*)); |
42 ev->instances = calloc(cfg->nthreads, sizeof(void*)); |
41 ev->numins = cfg->nthreads; |
43 ev->numins = cfg->nthreads; |
83 continue; |
83 continue; |
84 } |
84 } |
85 |
85 |
86 numchanges = 0; |
86 numchanges = 0; |
87 int numfinished = 0; |
87 int numfinished = 0; |
|
88 ev->numret = 0; |
88 for(int i=0;i<nev;i++) { |
89 for(int i=0;i<nev;i++) { |
89 Event *event = (Event*)events[i].udata; |
90 Event *event = (Event*)events[i].udata; |
90 if(!event) { |
91 if(!event) { |
91 if(events[i].flags == 0) { |
92 if(events[i].flags == 0) { |
92 log_ereport(LOG_WARN, "Unknown kevent (ident=%d)", (int)events[i].ident); |
93 log_ereport(LOG_WARN, "Unknown kevent (ident=%d)", (int)events[i].ident); |
142 // call event finish handlers |
143 // call event finish handlers |
143 for(int i=0;i<numfinished;i++) { |
144 for(int i=0;i<numfinished;i++) { |
144 Event *event = finished[i]; |
145 Event *event = finished[i]; |
145 finished[i]->finish(ev, event); |
146 finished[i]->finish(ev, event); |
146 } |
147 } |
|
148 // execute return calls |
|
149 for(int i=0;i<ev->numret;i++) { |
|
150 EVReturn ret = ev->fnreturn[i]; |
|
151 nsapi_saf_return(ret.sn, ret.rq, ret.ret); |
|
152 } |
147 } |
153 } |
148 } |
154 } |
149 |
155 |
150 int ev_pollin(EventHandler *h, int fd, Event *event) { |
156 int ev_pollin(EventHandler *h, int fd, Event *event) { |
151 event->events = EVENT_POLLIN; |
157 event->events = EVENT_POLLIN; |
204 } |
210 } |
205 |
211 |
206 int event_removepoll(EventHandler *ev, SYS_NETFD fd) { |
212 int event_removepoll(EventHandler *ev, SYS_NETFD fd) { |
207 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL); |
213 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL); |
208 } |
214 } |
|
215 |
|
216 |
|
217 void ev_saf_return(EventHandler *h, Session *sn, Request *rq, int ret) { |
|
218 h->fnreturn[h->numret++] = (EVReturn){ sn, rq, ret }; |
|
219 } |