82 } |
82 } |
83 |
83 |
84 return ev; |
84 return ev; |
85 } |
85 } |
86 |
86 |
|
87 #define EV_MAX_EVENTS 32 |
87 |
88 |
88 void ev_handle_events(EventHandler *ev) { |
89 void ev_handle_events(EventHandler *ev) { |
89 int ep = ev->ep; |
90 int ep = ev->ep; |
90 |
91 |
91 //port_event_t events[16]; |
92 struct epoll_event events[EV_MAX_EVENTS]; |
92 struct epoll_event events[16]; |
93 Event* finished[EV_MAX_EVENTS]; |
93 |
94 |
94 for(;;) { |
95 for(;;) { |
95 /* wait for events */ |
96 /* wait for events */ |
96 int ret = epoll_wait(ep, events, 16, 100000); |
97 int ret = epoll_wait(ep, events, 16, 100000); |
97 if(ret == -1 && errno != EINTR) { |
98 if(ret == -1 && errno != EINTR) { |
98 log_ereport(LOG_FAILURE, "epoll_wait failed: %s", strerror(errno)); |
99 log_ereport(LOG_FAILURE, "epoll_wait failed: %s", strerror(errno)); |
99 continue; |
100 continue; |
100 } |
101 } |
101 |
102 |
|
103 int numfinished = 0; |
102 for(int i=0;i<ret;i++) { |
104 for(int i=0;i<ret;i++) { |
103 Event *event = events[i].data.ptr; |
105 Event *event = events[i].data.ptr; |
104 if(!event) { |
106 if(!event) { |
105 char ebuf[sizeof(Event*)]; |
107 char ebuf[sizeof(Event*)]; |
106 int ebufpos = 0; |
108 int ebufpos = 0; |
132 "epoll_ctl failed: fd: %d error: %s", |
134 "epoll_ctl failed: fd: %d error: %s", |
133 event->object, |
135 event->object, |
134 strerror(errno)); |
136 strerror(errno)); |
135 } |
137 } |
136 |
138 |
137 // if set, execute event->finish |
139 // if set, remember this event and |
|
140 // execute event->finish later |
138 if(event->finish) { |
141 if(event->finish) { |
139 event->finish(ev, event); |
142 finished[numfinished++] = event; |
|
143 //event->finish(ev, event); |
140 } |
144 } |
141 } else { |
145 } else { |
142 if(saved_ev != event->events) { |
146 if(saved_ev != event->events) { |
143 // event type changed |
147 // event type changed |
144 struct epoll_event epev; |
148 struct epoll_event epev; |