src/server/daemon/event_solaris.c

changeset 529
cd606400f0ba
parent 443
ef3c8a0e1fee
child 531
9b15b1f72bef
equal deleted inserted replaced
528:8206bfafb7a6 529:cd606400f0ba
59 } 59 }
60 60
61 return ev; 61 return ev;
62 } 62 }
63 63
64 #define EV_MAX_EVENTS 32
65
64 void ev_handle_events(EventHandler *ev) { 66 void ev_handle_events(EventHandler *ev) {
65 port_event_t events[64]; 67 port_event_t events[EV_MAX_EVENTS];
68 Event *finished[EV_MAX_EVENTS];
66 struct timespec timeout; 69 struct timespec timeout;
67 timeout.tv_nsec = 0; 70 timeout.tv_nsec = 0;
68 timeout.tv_sec = 600; 71 timeout.tv_sec = 600;
69 72
70 for(;;) { 73 for(;;) {
71 // wait for events 74 // wait for events
72 uint_t nev = 1; 75 uint_t nev = 1;
73 int ret = port_getn(ev->port, events, 64, &nev, &timeout); 76 int ret = port_getn(ev->port, events, EV_MAX_EVENTS, &nev, &timeout);
74 if(ret == -1) { 77 if(ret == -1) {
75 // TODO: check for error 78 // TODO: check for error
76 perror("port_getn"); 79 perror("port_getn");
77 continue; 80 continue;
78 } 81 }
79 82
83 int numfinished = 0;
80 for(int i=0;i<nev;i++) { 84 for(int i=0;i<nev;i++) {
81 Event *event = events[i].portev_user; 85 Event *event = events[i].portev_user;
82 if(events[i].portev_source == PORT_SOURCE_AIO) { 86 if(events[i].portev_source == PORT_SOURCE_AIO) {
83 aiocb_t *aiocb = (aiocb_t*)events[i].portev_object; 87 aiocb_t *aiocb = (aiocb_t*)events[i].portev_object;
84 if(event) { 88 if(event) {
85 aiocb_s *aio = (aiocb_s*)event->object; 89 aiocb_s *aio = (aiocb_s*)event->object;
86 aio->result = aiocb->aio_resultp.aio_return; 90 aio->result = aiocb->aio_resultp.aio_return;
87 aio->result_errno = aiocb->aio_resultp.aio_errno; 91 aio->result_errno = aiocb->aio_resultp.aio_errno;
88 if(event->fn) { 92 if(event->fn) {
89 if(!event->fn(ev, event) && event->finish) { 93 if(!event->fn(ev, event) && event->finish) {
90 event->finish(ev, event); 94 finished[numfinished++] = event;
91 } 95 }
92 } 96 }
93 } 97 }
94 free(aiocb); 98 free(aiocb);
95 } else { 99 } else {
113 event->finish(ev, event); 117 event->finish(ev, event);
114 } 118 }
115 } 119 }
116 } 120 }
117 } 121 }
122 // call event finish handlers
123 for(int i=0;i<numfinished;i++) {
124 Event *event = finished[i];
125 finished[i]->finish(ev, event);
126 }
118 } 127 }
119 } 128 }
120 129
121 int ev_convert2sys_events(int events) { 130 int ev_convert2sys_events(int events) {
122 int e = 0; 131 int e = 0;

mercurial