src/server/daemon/event_linux.c

changeset 529
cd606400f0ba
parent 474
eb7640c59e9b
child 531
9b15b1f72bef
equal deleted inserted replaced
528:8206bfafb7a6 529:cd606400f0ba
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;
156 } 160 }
157 } 161 }
158 } 162 }
159 } 163 }
160 } 164 }
165 // call event finish handlers
166 for(int i=0;i<numfinished;i++) {
167 Event *event = finished[i];
168 finished[i]->finish(ev, event);
169 }
161 } 170 }
162 } 171 }
163 172
164 int ev_convert2sys_events(int events) { 173 int ev_convert2sys_events(int events) {
165 int e = EPOLLET; 174 int e = EPOLLET;

mercurial