41 ev->current = 0; |
41 ev->current = 0; |
42 ev->instances = calloc(cfg->nthreads, sizeof(void*)); |
42 ev->instances = calloc(cfg->nthreads, sizeof(void*)); |
43 ev->numins = cfg->nthreads; |
43 ev->numins = cfg->nthreads; |
44 |
44 |
45 for(int i=0;i<cfg->nthreads;i++) { |
45 for(int i=0;i<cfg->nthreads;i++) { |
46 EventHandler *handler = malloc(sizeof(EventHandler)); |
46 EventHandlerKqueue *handler = malloc(sizeof(EventHandlerKqueue)); |
|
47 memset(handler, 0, sizeof(EventHandlerKqueue)); |
47 ev->instances[i] = handler; |
48 ev->instances[i] = handler; |
48 |
49 |
49 handler->kqueue = kqueue(); |
50 handler->kqueue = kqueue(); |
50 if(handler->kqueue < 0) { |
51 if(handler->kqueue < 0) { |
51 log_ereport(LOG_FAILURE, "evhandler_create: kqueue: %s", strerror(errno)); |
52 log_ereport(LOG_FAILURE, "evhandler_create: kqueue: %s", strerror(errno)); |
101 } |
103 } |
102 int event_events = event->events; |
104 int event_events = event->events; |
103 |
105 |
104 if(event->fn) { |
106 if(event->fn) { |
105 int saved_ev = event->events; |
107 int saved_ev = event->events; |
106 if(!event->fn(ev, event)) { |
108 if(!event->fn(h, event)) { |
107 // ret 0 => remove event |
109 // ret 0 => remove event |
108 |
110 |
109 if(event->finish) { |
111 if(event->finish) { |
110 finished[numfinished++] = event; |
112 finished[numfinished++] = event; |
111 } |
113 } |
143 // call event finish handlers |
145 // call event finish handlers |
144 for(int i=0;i<numfinished;i++) { |
146 for(int i=0;i<numfinished;i++) { |
145 Event *event = finished[i]; |
147 Event *event = finished[i]; |
146 // check again if the finish callback is set |
148 // check again if the finish callback is set |
147 if(finished[i]->finish) { |
149 if(finished[i]->finish) { |
148 finished[i]->finish(ev, event); |
150 finished[i]->finish(h, event); |
149 } |
151 } |
150 } |
152 } |
151 // execute return calls |
153 // execute return calls |
152 for(int i=0;i<ev->numret;i++) { |
154 for(int i=0;i<ev->base.numret;i++) { |
153 EVReturn ret = ev->fnreturn[i]; |
155 EVReturn ret = ev->base.fnreturn[i]; |
154 nsapi_saf_return(ret.sn, ret.rq, ret.ret); |
156 nsapi_saf_return(ret.sn, ret.rq, ret.ret); |
155 } |
157 } |
156 } |
158 } |
157 } |
159 } |
158 |
160 |
213 } |
215 } |
214 |
216 |
215 int event_removepoll(EventHandler *ev, SYS_NETFD fd) { |
217 int event_removepoll(EventHandler *ev, SYS_NETFD fd) { |
216 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL); |
218 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL); |
217 } |
219 } |
218 |
|
219 |
|
220 void ev_saf_return(EventHandler *h, Session *sn, Request *rq, int ret) { |
|
221 h->fnreturn[h->numret++] = (EVReturn){ sn, rq, ret }; |
|
222 } |
|