src/server/daemon/event_solaris.c

changeset 531
9b15b1f72bef
parent 529
cd606400f0ba
child 537
ad44e72fbf50
equal deleted inserted replaced
530:1e117b5d6710 531:9b15b1f72bef
32 32
33 #include "../util/io.h" 33 #include "../util/io.h"
34 34
35 #include "event_solaris.h" 35 #include "event_solaris.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;
59 } 61 }
60 62
61 return ev; 63 return ev;
62 } 64 }
63 65
64 #define EV_MAX_EVENTS 32
65 66
66 void ev_handle_events(EventHandler *ev) { 67 void ev_handle_events(EventHandler *ev) {
67 port_event_t events[EV_MAX_EVENTS]; 68 port_event_t events[EV_MAX_EVENTS];
68 Event *finished[EV_MAX_EVENTS]; 69 Event *finished[EV_MAX_EVENTS];
69 struct timespec timeout; 70 struct timespec timeout;
79 perror("port_getn"); 80 perror("port_getn");
80 continue; 81 continue;
81 } 82 }
82 83
83 int numfinished = 0; 84 int numfinished = 0;
85 ev->numret = 0;
84 for(int i=0;i<nev;i++) { 86 for(int i=0;i<nev;i++) {
85 Event *event = events[i].portev_user; 87 Event *event = events[i].portev_user;
86 if(events[i].portev_source == PORT_SOURCE_AIO) { 88 if(events[i].portev_source == PORT_SOURCE_AIO) {
87 aiocb_t *aiocb = (aiocb_t*)events[i].portev_object; 89 aiocb_t *aiocb = (aiocb_t*)events[i].portev_object;
88 if(event) { 90 if(event) {
122 // call event finish handlers 124 // call event finish handlers
123 for(int i=0;i<numfinished;i++) { 125 for(int i=0;i<numfinished;i++) {
124 Event *event = finished[i]; 126 Event *event = finished[i];
125 finished[i]->finish(ev, event); 127 finished[i]->finish(ev, event);
126 } 128 }
129 // execute return calls
130 for(int i=0;i<ev->numret;i++) {
131 EVReturn ret = ev->fnreturn[i];
132 nsapi_saf_return(ret.sn, ret.rq, ret.ret);
133 }
127 } 134 }
128 } 135 }
129 136
130 int ev_convert2sys_events(int events) { 137 int ev_convert2sys_events(int events) {
131 int e = 0; 138 int e = 0;
223 } 230 }
224 231
225 int event_removepoll(EventHandler *ev, SYS_NETFD fd) { 232 int event_removepoll(EventHandler *ev, SYS_NETFD fd) {
226 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL); 233 return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL);
227 } 234 }
235
236 void ev_saf_return(EventHandler *h, Session *sn, Request *rq, int ret) {
237 h->fnreturn[h->numret++] = (EVReturn){ sn, rq, ret };
238 }

mercurial