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 { |