src/server/daemon/event_bsd.c

changeset 547
280bf87c8689
parent 541
1e1fca11aaff
child 552
4ed0e46aa9dc
equal deleted inserted replaced
546:5494c28db896 547:280bf87c8689
62 } 62 }
63 63
64 return ev; 64 return ev;
65 } 65 }
66 66
67 static volatile int ev_close = 0;
68
69 void ev_instance_close(EventHandler *h) {
70 EventHandlerKqueue *ev = (EventHandlerKqueue*)h;
71 close(ev->kqueue);
72 ev_close = 1;
73 }
74
75 // unique event addr that indicates shutdown
76 static Event shutdown_event;
77 void ev_instance_shutdown(EventHandler *h) {
78 event_send(h, &shutdown_event);
79 }
67 80
68 void ev_handle_events(EventHandlerKqueue *ev) { 81 void ev_handle_events(EventHandlerKqueue *ev) {
69 EventHandler *h = (EventHandler*)ev; 82 EventHandler *h = (EventHandler*)ev;
70 struct timespec timeout; 83 struct timespec timeout;
71 timeout.tv_nsec = 0; 84 timeout.tv_nsec = 0;
79 92
80 for(;;) { 93 for(;;) {
81 // wait for events 94 // wait for events
82 int nev = kevent(ev->kqueue, changes, numchanges, events, EV_MAX_EVENTS, &timeout); 95 int nev = kevent(ev->kqueue, changes, numchanges, events, EV_MAX_EVENTS, &timeout);
83 if(nev == -1) { 96 if(nev == -1) {
84 log_ereport(LOG_FAILURE, "kevent: %s", strerror(errno)); 97 if(errno != EINTR) {
98 if(!ev_close) {
99 log_ereport(LOG_CATASTROPHE, "kevent failed: %s", strerror(errno));
100 }
101 break;
102 }
85 continue; 103 continue;
86 } 104 }
87 105
88 numchanges = 0; 106 numchanges = 0;
89 int numfinished = 0; 107 int numfinished = 0;
138 // delete 156 // delete
139 EV_SET(&changes[numchanges++], e_fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); 157 EV_SET(&changes[numchanges++], e_fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
140 } 158 }
141 } 159 }
142 } 160 }
161 } else if(event == &shutdown_event) {
162 ev_instance_close(h);
143 } 163 }
144 } 164 }
145 // call event finish handlers 165 // call event finish handlers
146 for(int i=0;i<numfinished;i++) { 166 for(int i=0;i<numfinished;i++) {
147 Event *event = finished[i]; 167 Event *event = finished[i];
154 for(int i=0;i<ev->base.numret;i++) { 174 for(int i=0;i<ev->base.numret;i++) {
155 EVReturn ret = ev->base.fnreturn[i]; 175 EVReturn ret = ev->base.fnreturn[i];
156 nsapi_saf_return(ret.sn, ret.rq, ret.ret); 176 nsapi_saf_return(ret.sn, ret.rq, ret.ret);
157 } 177 }
158 } 178 }
179
180 free(ev);
159 } 181 }
160 182
161 int ev_pollin(EventHandler *h, int fd, Event *event) { 183 int ev_pollin(EventHandler *h, int fd, Event *event) {
162 event->events = EVENT_POLLIN; 184 event->events = EVENT_POLLIN;
163 struct kevent kev; 185 struct kevent kev;

mercurial