src/server/daemon/event_linux.c

changeset 531
9b15b1f72bef
parent 529
cd606400f0ba
child 533
2d6099ba2a7c
equal deleted inserted replaced
530:1e117b5d6710 531:9b15b1f72bef
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*));
81 systhread_detach(t); 83 systhread_detach(t);
82 } 84 }
83 85
84 return ev; 86 return ev;
85 } 87 }
86
87 #define EV_MAX_EVENTS 32
88 88
89 void ev_handle_events(EventHandler *ev) { 89 void ev_handle_events(EventHandler *ev) {
90 int ep = ev->ep; 90 int ep = ev->ep;
91 91
92 struct epoll_event events[EV_MAX_EVENTS]; 92 struct epoll_event events[EV_MAX_EVENTS];
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 }

mercurial