src/server/daemon/event_bsd.c

changeset 541
1e1fca11aaff
parent 538
f9a7b5c76208
child 547
280bf87c8689
equal deleted inserted replaced
540:d9c3c23c635b 541:1e1fca11aaff
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));
62 63
63 return ev; 64 return ev;
64 } 65 }
65 66
66 67
67 void ev_handle_events(EventHandler *ev) { 68 void ev_handle_events(EventHandlerKqueue *ev) {
69 EventHandler *h = (EventHandler*)ev;
68 struct timespec timeout; 70 struct timespec timeout;
69 timeout.tv_nsec = 0; 71 timeout.tv_nsec = 0;
70 timeout.tv_sec = 600; 72 timeout.tv_sec = 600;
71 73
72 struct kevent events[EV_MAX_EVENTS]; 74 struct kevent events[EV_MAX_EVENTS];
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 }

mercurial