ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/event.c
(Generate patch)

Comparing libev/event.c (file contents):
Revision 1.5 by root, Sat Nov 3 19:41:56 2007 UTC vs.
Revision 1.8 by root, Sat Nov 3 22:10:39 2007 UTC

33#include <stdlib.h> 33#include <stdlib.h>
34#include <sys/time.h> 34#include <sys/time.h>
35 35
36#include "event.h" 36#include "event.h"
37 37
38#ifdef EV_MULTIPLICITY
39# define dLOOPev struct ev_loop *loop = ev->ev_base->loop
40# define dLOOPbase struct ev_loop *loop = base->loop
41#else
42# define dLOOPev
43# define dLOOPbase
44#endif
45
38struct event_base 46struct event_base
39{ 47{
48#ifdef EV_MULTIPLICITY
49 struct ev_loop *loop;
50#endif
40 int dummy; 51 int dummy;
41}; 52};
42
43static int x_actives;
44 53
45static struct event_base x_base, *x_cur; 54static struct event_base x_base, *x_cur;
46 55
47static void 56static void
48tv_set (struct timeval *tv, ev_tstamp at) 57tv_set (struct timeval *tv, ev_tstamp at)
72 return "libev"; 81 return "libev";
73} 82}
74 83
75void *event_init (void) 84void *event_init (void)
76{ 85{
77 if (ev_init (0)) 86 if (!x_cur && ev_init (0))
78 return x_cur = &x_base; 87 return x_cur = &x_base;
79 88
80 return 0; 89 return 0;
81} 90}
82 91
83void event_base_free (struct event_base *base) 92void event_base_free (struct event_base *base)
84{ 93{
94 dLOOPbase;
95
85 /* nop */ 96 /* nop */
86} 97}
87 98
88int event_dispatch (void) 99int event_dispatch (void)
89{ 100{
108} 119}
109 120
110static void 121static void
111x_cb (struct event *ev, int revents) 122x_cb (struct event *ev, int revents)
112{ 123{
113 if (ev->ev_events & EV_SIGNAL)
114 {
115 /* sig */
116 if (ev_is_active (&ev->iosig.sig))
117 {
118 ev_signal_stop (&ev->iosig.sig);
119 --x_actives;
120 }
121 }
122 else
123 {
124 /* io */
125 if (!(ev->ev_events & EV_PERSIST) && ev_is_active (&ev->iosig.io))
126 {
127 ev_io_stop (&ev->iosig.io);
128 --x_actives;
129 }
130 }
131
132 revents &= EV_READ | EV_WRITE | EV_TIMEOUT | EV_SIGNAL; 124 revents &= EV_READ | EV_WRITE | EV_TIMEOUT | EV_SIGNAL;
133
134 if (revents & EV_TIMEOUT)
135 --x_actives;
136 125
137 ev->ev_res = revents; 126 ev->ev_res = revents;
138 ev->ev_callback (ev->ev_fd, revents, ev->ev_arg); 127 ev->ev_callback (ev->ev_fd, revents, ev->ev_arg);
139} 128}
140 129
141static void 130static void
142x_cb_io (struct ev_io *w, int revents) 131x_cb_sig (EV_P_ struct ev_signal *w, int revents)
143{ 132{
144 x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.io)), revents); 133 x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.sig)), revents);
145} 134}
146 135
147static void 136static void
137x_cb_io (EV_P_ struct ev_io *w, int revents)
138{
139 struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.io));
140
141 if (!(ev->ev_events & EV_PERSIST) && ev_is_active (w))
142 ev_io_stop (w);
143
144 x_cb (ev, revents);
145}
146
147static void
148x_cb_to (struct ev_timer *w, int revents) 148x_cb_to (EV_P_ struct ev_timer *w, int revents)
149{ 149{
150 x_cb ((struct event *)(((char *)w) - offsetof (struct event, to)), revents); 150 x_cb ((struct event *)(((char *)w) - offsetof (struct event, to)), revents);
151}
152
153static void
154x_cb_sig (struct ev_signal *w, int revents)
155{
156 x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.sig)), revents);
157} 151}
158 152
159void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg) 153void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg)
160{ 154{
161 if (events & EV_SIGNAL) 155 if (events & EV_SIGNAL)
179 return event_base_once (x_cur, fd, events, cb, arg, tv); 173 return event_base_once (x_cur, fd, events, cb, arg, tv);
180} 174}
181 175
182int event_add (struct event *ev, struct timeval *tv) 176int event_add (struct event *ev, struct timeval *tv)
183{ 177{
178 dLOOPev;
179
184 /* disable all watchers */ 180 /* disable all watchers */
185 event_del (ev); 181 event_del (ev);
186 182
187 if (ev->ev_events & EV_SIGNAL) 183 if (ev->ev_events & EV_SIGNAL)
188 { 184 {
189 ev_signal_set (&ev->iosig.sig, ev->ev_fd); 185 ev_signal_set (&ev->iosig.sig, ev->ev_fd);
190 ev_signal_start (&ev->iosig.sig); 186 ev_signal_start (EV_A_ &ev->iosig.sig);
191 ++x_actives;
192 } 187 }
193 else if (ev->ev_events & (EV_READ | EV_WRITE)) 188 else if (ev->ev_events & (EV_READ | EV_WRITE))
194 { 189 {
195 ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE)); 190 ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE));
196 ev_io_start (&ev->iosig.io); 191 ev_io_start (EV_A_ &ev->iosig.io);
197 ++x_actives;
198 } 192 }
199 193
200 if (tv) 194 if (tv)
201 { 195 {
202 ev_timer_set (&ev->to, tv_get (tv), 0.); 196 ev_timer_set (&ev->to, tv_get (tv), 0.);
203 ev_timer_start (&ev->to); 197 ev_timer_start (EV_A_ &ev->to);
204 ++x_actives;
205 } 198 }
206 199
207 return 0; 200 return 0;
208} 201}
209 202
210int event_del (struct event *ev) 203int event_del (struct event *ev)
211{ 204{
205 dLOOPev;
206
212 if (ev->ev_events & EV_SIGNAL) 207 if (ev->ev_events & EV_SIGNAL)
213 { 208 {
214 /* sig */ 209 /* sig */
215 if (ev_is_active (&ev->iosig.sig)) 210 if (ev_is_active (&ev->iosig.sig))
216 {
217 ev_signal_stop (&ev->iosig.sig); 211 ev_signal_stop (EV_A_ &ev->iosig.sig);
218 --x_actives;
219 }
220 } 212 }
221 else 213 else
222 { 214 {
223 /* io */ 215 /* io */
224 if (ev_is_active (&ev->iosig.io)) 216 if (ev_is_active (&ev->iosig.io))
225 {
226 ev_io_stop (&ev->iosig.io); 217 ev_io_stop (EV_A_ &ev->iosig.io);
227 --x_actives;
228 }
229 } 218 }
230 219
231 if (ev_is_active (&ev->to)) 220 if (ev_is_active (&ev->to))
232 {
233 ev_timer_stop (&ev->to); 221 ev_timer_stop (EV_A_ &ev->to);
234 --x_actives;
235 }
236 222
237 return 0; 223 return 0;
238} 224}
239 225
240int event_pending (struct event *ev, short events, struct timeval *tv) 226int event_pending (struct event *ev, short events, struct timeval *tv)
241{ 227{
228 dLOOPev;
229
242 short revents = 0; 230 short revents = 0;
243 231
244 if (ev->ev_events & EV_SIGNAL) 232 if (ev->ev_events & EV_SIGNAL)
245 { 233 {
246 /* sig */ 234 /* sig */
257 if (ev->to.pending) 245 if (ev->to.pending)
258 { 246 {
259 revents |= EV_TIMEOUT; 247 revents |= EV_TIMEOUT;
260 248
261 if (tv) 249 if (tv)
262 tv_set (tv, ev_now); /* not sure if this is right :) */ 250 tv_set (tv, ev_now (EV_A)); /* not sure if this is right :) */
263 } 251 }
264 252
265 return events & revents; 253 return events & revents;
266} 254}
267 255
284 return 0; 272 return 0;
285} 273}
286 274
287int event_base_loop (struct event_base *base, int flags) 275int event_base_loop (struct event_base *base, int flags)
288{ 276{
289 do 277 dLOOPbase;
290 { 278
291 ev_loop (flags | EVLOOP_ONESHOT); 279 ev_loop (EV_A_ flags);
292 }
293 while (!(flags & (EVLOOP_ONESHOT | EVLOOP_NONBLOCK)) && x_actives && !ev_loop_done);
294 280
295 return 0; 281 return 0;
296} 282}
297 283
298int event_base_dispatch (struct event_base *base) 284int event_base_dispatch (struct event_base *base)
299{ 285{
300 return event_base_loop (base, 0); 286 return event_base_loop (base, 0);
301} 287}
302 288
303static void 289static void
304x_loopexit_cb (int revents, void *arg) 290x_loopexit_cb (EV_P_ int revents, void *arg)
305{ 291{
306 ev_loop_done = 2; 292 ev_unloop (EV_A_ 2);
307} 293}
308 294
309int event_base_loopexit (struct event_base *base, struct timeval *tv) 295int event_base_loopexit (struct event_base *base, struct timeval *tv)
310{ 296{
297 dLOOPbase;
311 ev_tstamp after = tv_get (tv); 298 ev_tstamp after = tv_get (tv);
312 299
313 ev_once (-1, 0, after >= 0. ? after : 0., x_loopexit_cb, (void *)base); 300 ev_once (EV_A_ -1, 0, after >= 0. ? after : 0., x_loopexit_cb, (void *)base);
314 301
315 return -1; 302 return -1;
316} 303}
317 304
318struct x_once 305struct x_once
331 free (once); 318 free (once);
332} 319}
333 320
334int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv) 321int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv)
335{ 322{
323 dLOOPbase;
336 struct x_once *once = malloc (sizeof (struct x_once)); 324 struct x_once *once = malloc (sizeof (struct x_once));
337 325
338 if (!once) 326 if (!once)
339 return -1; 327 return -1;
340 328
341 once->fd = fd; 329 once->fd = fd;
342 once->cb = cb; 330 once->cb = cb;
343 once->arg = arg; 331 once->arg = arg;
344 332
345 ev_once (fd, events & (EV_READ | EV_WRITE), tv_get (tv), x_once_cb, (void *)once); 333 ev_once (EV_A_ fd, events & (EV_READ | EV_WRITE), tv_get (tv), x_once_cb, (void *)once);
346 334
347 return 0; 335 return 0;
348} 336}
349 337
350int event_base_priority_init (struct event_base *base, int npri) 338int event_base_priority_init (struct event_base *base, int npri)
351{ 339{
352 return 0; 340 dLOOPbase;
353}
354 341
342 return 0;
343}
344

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines