ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV/EV.xs
(Generate patch)

Comparing EV/EV.xs (file contents):
Revision 1.7 by root, Sat Oct 27 14:54:21 2007 UTC vs.
Revision 1.10 by root, Mon Oct 29 07:56:03 2007 UTC

24#define EV_UNDEF -1 24#define EV_UNDEF -1
25 25
26#define TIMEOUT_NONE HUGE_VAL 26#define TIMEOUT_NONE HUGE_VAL
27 27
28typedef struct event_base *Base; 28typedef struct event_base *Base;
29typedef int Signal;
29 30
30static HV *stash_base, *stash_event; 31static HV *stash_base, *stash_event;
31 32
32static double tv_get (struct timeval *tv) 33static double tv_get (struct timeval *tv)
33{ 34{
37static void tv_set (struct timeval *tv, double val) 38static void tv_set (struct timeval *tv, double val)
38{ 39{
39 tv->tv_sec = (long)val; 40 tv->tv_sec = (long)val;
40 tv->tv_usec = (long)((val - (double)tv->tv_sec) * 1e6); 41 tv->tv_usec = (long)((val - (double)tv->tv_sec) * 1e6);
41 42
43}
44
45static int
46sv_signum (SV *sig)
47{
48 int signum;
49
50 if (SvIV (sig) > 0)
51 return SvIV (sig);
52
53 for (signum = 1; signum < SIG_SIZE; ++signum)
54 if (strEQ (SvPV_nolen (sig), PL_sig_name [signum]))
55 return signum;
56
57 return -1;
42} 58}
43 59
44///////////////////////////////////////////////////////////////////////////// 60/////////////////////////////////////////////////////////////////////////////
45// Event 61// Event
46 62
178 EXTEND (SP, 2); 194 EXTEND (SP, 2);
179 PUSHs (sv_2mortal (e_self (ev))); 195 PUSHs (sv_2mortal (e_self (ev)));
180 PUSHs (sv_2mortal (newSViv (events))); 196 PUSHs (sv_2mortal (newSViv (events)));
181 PUTBACK; 197 PUTBACK;
182 call_sv (ev->cb, G_DISCARD | G_VOID | G_EVAL); 198 call_sv (ev->cb, G_DISCARD | G_VOID | G_EVAL);
183 /*TODO: if err, call some logging function */
184 199
185 if (ev->interval && !ev->active) 200 if (ev->interval && !ev->active)
186 e_start (ev); 201 e_start (ev);
187 202
188 FREETMPS; 203 FREETMPS;
204
205 if (SvTRUE (ERRSV))
206 {
207 PUSHMARK (SP);
208 PUTBACK;
209 call_sv (get_sv ("EV::DIED", 1), G_DISCARD | G_VOID | G_EVAL | G_KEEPERR);
210 }
211
189 LEAVE; 212 LEAVE;
190} 213}
191 214
192///////////////////////////////////////////////////////////////////////////// 215/////////////////////////////////////////////////////////////////////////////
193// DNS 216// DNS
228 251
229 PUTBACK; 252 PUTBACK;
230 call_sv (sv_2mortal (cb), G_DISCARD | G_VOID | G_EVAL); 253 call_sv (sv_2mortal (cb), G_DISCARD | G_VOID | G_EVAL);
231 254
232 FREETMPS; 255 FREETMPS;
256
257 if (SvTRUE (ERRSV))
258 {
259 PUSHMARK (SP);
260 PUTBACK;
261 call_sv (get_sv ("EV::DIED", 1), G_DISCARD | G_VOID | G_EVAL | G_KEEPERR);
262 }
263
233 LEAVE; 264 LEAVE;
234} 265}
235 266
236///////////////////////////////////////////////////////////////////////////// 267/////////////////////////////////////////////////////////////////////////////
237// XS interface functions 268// XS interface functions
238 269
239MODULE = EV PACKAGE = EV PREFIX = event_ 270MODULE = EV PACKAGE = EV PREFIX = event_
240 271
241BOOT: 272BOOT:
242{ 273{
274 int i;
243 HV *stash = gv_stashpv ("EV", 1); 275 HV *stash = gv_stashpv ("EV", 1);
244 276
245 static const struct { 277 static const struct {
246 const char *name; 278 const char *name;
247 IV iv; 279 IV iv;
312 RETVAL = e_new (fh, events, cb); 344 RETVAL = e_new (fh, events, cb);
313 if (!ix) e_start (RETVAL); 345 if (!ix) e_start (RETVAL);
314 OUTPUT: 346 OUTPUT:
315 RETVAL 347 RETVAL
316 348
349Event timed_io (SV *fh, short events, double timeout, SV *cb)
350 ALIAS:
351 timed_io_ns = 1
352 CODE:
353{
354 events = timeout ? events & ~EV_PERSIST : events | EV_PERSIST;
355
356 RETVAL = e_new (fh, events, cb);
357
358 if (timeout)
359 {
360 RETVAL->timeout = timeout;
361 RETVAL->interval = 1;
362 }
363
364 if (!ix) e_start (RETVAL);
365}
366 OUTPUT:
367 RETVAL
368
317Event timer (double after, int repeat, SV *cb) 369Event timer (double after, int repeat, SV *cb)
318 ALIAS: 370 ALIAS:
319 timer_ns = 1 371 timer_ns = 1
320 CODE: 372 CODE:
321 RETVAL = e_new (NEWSV (0, 0), 0, cb); 373 RETVAL = e_new (NEWSV (0, 0), 0, cb);
335 RETVAL->abstime = 1; 387 RETVAL->abstime = 1;
336 if (!ix) e_start (RETVAL); 388 if (!ix) e_start (RETVAL);
337 OUTPUT: 389 OUTPUT:
338 RETVAL 390 RETVAL
339 391
340Event signal (SV *signal, SV *cb) 392Event signal (Signal signum, SV *cb)
341 ALIAS: 393 ALIAS:
342 signal_ns = 1 394 signal_ns = 1
343 CODE: 395 CODE:
344 RETVAL = e_new (signal, EV_SIGNAL | EV_PERSIST, cb); 396 RETVAL = e_new (ST (0), EV_SIGNAL | EV_PERSIST, cb);
397 RETVAL->ev.ev_fd = signum;
345 if (!ix) e_start (RETVAL); 398 if (!ix) e_start (RETVAL);
346 OUTPUT: 399 OUTPUT:
347 RETVAL 400 RETVAL
348 401
349PROTOTYPES: DISABLE 402PROTOTYPES: DISABLE
420 sv_setsv (ev->cb, new_cb); 473 sv_setsv (ev->cb, new_cb);
421 OUTPUT: 474 OUTPUT:
422 RETVAL 475 RETVAL
423 476
424SV *fh (Event ev, SV *new_fh = 0) 477SV *fh (Event ev, SV *new_fh = 0)
425 ALIAS:
426 signal = 0
427 CODE: 478 CODE:
428 RETVAL = newSVsv (ev->fh); 479 RETVAL = newSVsv (ev->fh);
429 if (items > 1) 480 if (items > 1)
430 { 481 {
431 if (ev->active) event_del (&ev->ev); 482 if (ev->active) event_del (&ev->ev);
432 sv_setsv (ev->fh, new_fh); 483 sv_setsv (ev->fh, new_fh);
433 ev->ev.ev_fd = sv_fileno (ev->fh); 484 ev->ev.ev_fd = sv_fileno (ev->fh);
485 ev->ev.ev_events &= ev->ev.ev_events & ~EV_SIGNAL;
434 if (ev->active) event_add (&ev->ev, e_tv (ev)); 486 if (ev->active) event_add (&ev->ev, e_tv (ev));
435 } 487 }
488 OUTPUT:
489 RETVAL
490
491SV *signal (Event ev, SV *new_signal = 0)
492 CODE:
493{
494 Signal signum;
495
496 if (items > 1)
497 signum = sv_signum (new_signal); /* may croak here */
498
499 RETVAL = newSVsv (ev->fh);
500
501 if (items > 1)
502 {
503 if (ev->active) event_del (&ev->ev);
504 sv_setsv (ev->fh, new_signal);
505 ev->ev.ev_fd = signum;
506 ev->ev.ev_events |= EV_SIGNAL;
507 if (ev->active) event_add (&ev->ev, e_tv (ev));
508 }
509}
436 OUTPUT: 510 OUTPUT:
437 RETVAL 511 RETVAL
438 512
439short events (Event ev, short new_events = EV_UNDEF) 513short events (Event ev, short new_events = EV_UNDEF)
440 CODE: 514 CODE:
535 CODE: 609 CODE:
536{ 610{
537 STRLEN len; 611 STRLEN len;
538 char *data = SvPVbyte (addr, len); 612 char *data = SvPVbyte (addr, len);
539 if (len != (ix ? 16 : 4)) 613 if (len != (ix ? 16 : 4))
540 croak ("ipv4/ipv6 address to resolve must be given as 4/16 byte octet string"); 614 croak ("ipv4/ipv6 address to be resolved must be given as 4/16 byte octet string");
541 615
542 RETVAL = ix 616 RETVAL = ix
543 ? evdns_resolve_reverse_ipv6 ((struct in6_addr *)data, flags, dns_cb, (void *)SvREFCNT_inc (cb)) 617 ? evdns_resolve_reverse_ipv6 ((struct in6_addr *)data, flags, dns_cb, (void *)SvREFCNT_inc (cb))
544 : evdns_resolve_reverse ((struct in_addr *)data, flags, dns_cb, (void *)SvREFCNT_inc (cb)); 618 : evdns_resolve_reverse ((struct in_addr *)data, flags, dns_cb, (void *)SvREFCNT_inc (cb));
545} 619}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines