… | |
… | |
106 | } |
106 | } |
107 | |
107 | |
108 | static void |
108 | static void |
109 | x_cb (struct event *ev, int revents) |
109 | x_cb (struct event *ev, int revents) |
110 | { |
110 | { |
|
|
111 | if (ev->ev_events & EV_SIGNAL) |
|
|
112 | { |
|
|
113 | /* sig */ |
111 | if (ev_is_active (&ev->sig)) |
114 | if (ev_is_active (&ev->iosig.sig)) |
112 | { |
115 | { |
113 | ev_signal_stop (&ev->sig); |
116 | ev_signal_stop (&ev->iosig.sig); |
114 | --x_actives; |
117 | --x_actives; |
|
|
118 | } |
|
|
119 | } |
|
|
120 | else |
115 | } |
121 | { |
116 | |
122 | /* io */ |
117 | if (!(ev->ev_events & EV_PERSIST) && ev_is_active (&ev->io)) |
123 | if (!(ev->ev_events & EV_PERSIST) && ev_is_active (&ev->iosig.io)) |
118 | { |
124 | { |
119 | ev_io_stop (&ev->io); |
125 | ev_io_stop (&ev->iosig.io); |
120 | --x_actives; |
126 | --x_actives; |
|
|
127 | } |
121 | } |
128 | } |
122 | |
129 | |
123 | revents &= EV_READ | EV_WRITE | EV_TIMEOUT | EV_SIGNAL; |
130 | revents &= EV_READ | EV_WRITE | EV_TIMEOUT | EV_SIGNAL; |
124 | |
131 | |
125 | if (revents & EV_TIMEOUT) |
132 | if (revents & EV_TIMEOUT) |
… | |
… | |
130 | } |
137 | } |
131 | |
138 | |
132 | static void |
139 | static void |
133 | x_cb_io (struct ev_io *w, int revents) |
140 | x_cb_io (struct ev_io *w, int revents) |
134 | { |
141 | { |
135 | x_cb ((struct event *)(((char *)w) - offsetof (struct event, io)), revents); |
142 | x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.io)), revents); |
136 | } |
143 | } |
137 | |
144 | |
138 | static void |
145 | static void |
139 | x_cb_to (struct ev_timer *w, int revents) |
146 | x_cb_to (struct ev_timer *w, int revents) |
140 | { |
147 | { |
… | |
… | |
142 | } |
149 | } |
143 | |
150 | |
144 | static void |
151 | static void |
145 | x_cb_sig (struct ev_signal *w, int revents) |
152 | x_cb_sig (struct ev_signal *w, int revents) |
146 | { |
153 | { |
147 | x_cb ((struct event *)(((char *)w) - offsetof (struct event, sig)), revents); |
154 | x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.sig)), revents); |
148 | } |
155 | } |
149 | |
156 | |
150 | void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg) |
157 | void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg) |
151 | { |
158 | { |
|
|
159 | if (events & EV_SIGNAL) |
|
|
160 | ev_watcher_init (&ev->iosig.sig, x_cb_sig); |
|
|
161 | else |
152 | ev_watcher_init (&ev->io, x_cb_io); |
162 | ev_watcher_init (&ev->iosig.io, x_cb_io); |
|
|
163 | |
153 | ev_watcher_init (&ev->to, x_cb_to); |
164 | ev_watcher_init (&ev->to, x_cb_to); |
154 | ev_watcher_init (&ev->sig, x_cb_sig); |
|
|
155 | |
165 | |
156 | ev->ev_base = x_cur; |
166 | ev->ev_base = x_cur; |
157 | ev->ev_fd = fd; |
167 | ev->ev_fd = fd; |
158 | ev->ev_events = events; |
168 | ev->ev_events = events; |
159 | ev->ev_pri = 0; |
169 | ev->ev_pri = 0; |
… | |
… | |
167 | event_base_once (x_cur, fd, events, cb, arg, tv); |
177 | event_base_once (x_cur, fd, events, cb, arg, tv); |
168 | } |
178 | } |
169 | |
179 | |
170 | int event_add (struct event *ev, struct timeval *tv) |
180 | int event_add (struct event *ev, struct timeval *tv) |
171 | { |
181 | { |
|
|
182 | /* disable all watchers */ |
|
|
183 | event_del (ev); |
|
|
184 | |
|
|
185 | if (ev->ev_events & EV_SIGNAL) |
|
|
186 | { |
|
|
187 | ev_signal_set (&ev->iosig.sig, ev->ev_fd); |
|
|
188 | ev_signal_start (&ev->iosig.sig); |
|
|
189 | ++x_actives; |
|
|
190 | } |
|
|
191 | else if (ev->ev_events & (EV_READ | EV_WRITE)) |
|
|
192 | { |
|
|
193 | ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE)); |
|
|
194 | ev_io_start (&ev->iosig.io); |
|
|
195 | ++x_actives; |
|
|
196 | } |
|
|
197 | |
172 | if (tv) |
198 | if (tv) |
173 | { |
199 | { |
174 | if (ev_is_active (&ev->to)) |
|
|
175 | { |
|
|
176 | ev_timer_stop (&ev->to); |
|
|
177 | --x_actives; |
|
|
178 | } |
|
|
179 | |
|
|
180 | ev_timer_set (&ev->to, tv_get (tv), 0.); |
200 | ev_timer_set (&ev->to, tv_get (tv), 0.); |
181 | ev_timer_start (&ev->to); |
201 | ev_timer_start (&ev->to); |
182 | ++x_actives; |
202 | ++x_actives; |
183 | } |
203 | } |
184 | |
204 | |
185 | if (ev->ev_events & (EV_READ | EV_WRITE)) |
205 | return 0; |
|
|
206 | } |
|
|
207 | |
|
|
208 | int event_del (struct event *ev) |
|
|
209 | { |
|
|
210 | if (ev->ev_events & EV_SIGNAL) |
186 | { |
211 | { |
|
|
212 | /* sig */ |
187 | if (ev_is_active (&ev->io)) |
213 | if (ev_is_active (&ev->iosig.sig)) |
188 | { |
214 | { |
189 | ev_io_stop (&ev->io); |
215 | ev_signal_stop (&ev->iosig.sig); |
190 | --x_actives; |
216 | --x_actives; |
191 | } |
217 | } |
192 | |
|
|
193 | ev_io_set (&ev->io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE)); |
|
|
194 | ev_io_start (&ev->io); |
|
|
195 | ++x_actives; |
|
|
196 | } |
|
|
197 | |
|
|
198 | if (ev->ev_events & EV_SIGNAL) |
|
|
199 | { |
218 | } |
|
|
219 | else |
|
|
220 | { |
|
|
221 | /* io */ |
200 | if (ev_is_active (&ev->sig)) |
222 | if (ev_is_active (&ev->iosig.io)) |
201 | { |
223 | { |
202 | ev_signal_stop (&ev->sig); |
224 | ev_io_stop (&ev->iosig.io); |
203 | --x_actives; |
225 | --x_actives; |
204 | } |
226 | } |
205 | |
|
|
206 | ev_signal_set (&ev->sig, ev->ev_fd); |
|
|
207 | ev_signal_start (&ev->sig); |
|
|
208 | ++x_actives; |
|
|
209 | } |
|
|
210 | |
|
|
211 | return 0; |
|
|
212 | } |
|
|
213 | |
|
|
214 | int event_del (struct event *ev) |
|
|
215 | { |
|
|
216 | if (ev_is_active (&ev->io)) |
|
|
217 | { |
|
|
218 | ev_io_stop (&ev->io); |
|
|
219 | --x_actives; |
|
|
220 | } |
227 | } |
221 | |
228 | |
222 | if (ev_is_active (&ev->to)) |
229 | if (ev_is_active (&ev->to)) |
223 | { |
230 | { |
224 | ev_timer_stop (&ev->to); |
231 | ev_timer_stop (&ev->to); |
225 | --x_actives; |
232 | --x_actives; |
226 | } |
233 | } |
227 | |
234 | |
228 | if (ev_is_active (&ev->sig)) |
|
|
229 | { |
|
|
230 | ev_signal_stop (&ev->sig); |
|
|
231 | --x_actives; |
|
|
232 | } |
|
|
233 | |
|
|
234 | return 0; |
235 | return 0; |
235 | } |
236 | } |
236 | |
237 | |
237 | int event_pending (struct event *ev, short events, struct timeval *tv) |
238 | int event_pending (struct event *ev, short events, struct timeval *tv) |
238 | { |
239 | { |
239 | short revents; |
240 | short revents; |
240 | |
241 | |
|
|
242 | if (ev->ev_events & EV_SIGNAL) |
|
|
243 | { |
|
|
244 | /* sig */ |
|
|
245 | if (ev->iosig.sig.pending) |
|
|
246 | revents |= EV_SIGNAL; |
|
|
247 | } |
|
|
248 | else |
|
|
249 | { |
|
|
250 | /* io */ |
241 | if (ev->io.pending) |
251 | if (ev->iosig.io.pending) |
242 | revents |= ev->ev_events & (EV_READ | EV_WRITE); |
252 | revents |= ev->ev_events & (EV_READ | EV_WRITE); |
|
|
253 | } |
243 | |
254 | |
244 | if (ev->to.pending) |
255 | if (ev->to.pending) |
245 | { |
256 | { |
246 | revents |= EV_TIMEOUT; |
257 | revents |= EV_TIMEOUT; |
247 | |
258 | |
248 | if (tv) |
259 | if (tv) |
249 | tv_set (tv, ev_now); /* not sure if this is right :) */ |
260 | tv_set (tv, ev_now); /* not sure if this is right :) */ |
250 | } |
261 | } |
251 | |
|
|
252 | if (ev->sig.pending) |
|
|
253 | revents |= EV_SIGNAL; |
|
|
254 | |
262 | |
255 | return events & revents; |
263 | return events & revents; |
256 | } |
264 | } |
257 | |
265 | |
258 | int event_priority_init (int npri) |
266 | int event_priority_init (int npri) |