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