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

Comparing cvsroot/EV/EV.xs (file contents):
Revision 1.8 by root, Sat Oct 27 19:11:27 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
253 269
254MODULE = EV PACKAGE = EV PREFIX = event_ 270MODULE = EV PACKAGE = EV PREFIX = event_
255 271
256BOOT: 272BOOT:
257{ 273{
274 int i;
258 HV *stash = gv_stashpv ("EV", 1); 275 HV *stash = gv_stashpv ("EV", 1);
259 276
260 static const struct { 277 static const struct {
261 const char *name; 278 const char *name;
262 IV iv; 279 IV iv;
327 RETVAL = e_new (fh, events, cb); 344 RETVAL = e_new (fh, events, cb);
328 if (!ix) e_start (RETVAL); 345 if (!ix) e_start (RETVAL);
329 OUTPUT: 346 OUTPUT:
330 RETVAL 347 RETVAL
331 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
332Event timer (double after, int repeat, SV *cb) 369Event timer (double after, int repeat, SV *cb)
333 ALIAS: 370 ALIAS:
334 timer_ns = 1 371 timer_ns = 1
335 CODE: 372 CODE:
336 RETVAL = e_new (NEWSV (0, 0), 0, cb); 373 RETVAL = e_new (NEWSV (0, 0), 0, cb);
350 RETVAL->abstime = 1; 387 RETVAL->abstime = 1;
351 if (!ix) e_start (RETVAL); 388 if (!ix) e_start (RETVAL);
352 OUTPUT: 389 OUTPUT:
353 RETVAL 390 RETVAL
354 391
355Event signal (SV *signal, SV *cb) 392Event signal (Signal signum, SV *cb)
356 ALIAS: 393 ALIAS:
357 signal_ns = 1 394 signal_ns = 1
358 CODE: 395 CODE:
359 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;
360 if (!ix) e_start (RETVAL); 398 if (!ix) e_start (RETVAL);
361 OUTPUT: 399 OUTPUT:
362 RETVAL 400 RETVAL
363 401
364PROTOTYPES: DISABLE 402PROTOTYPES: DISABLE
435 sv_setsv (ev->cb, new_cb); 473 sv_setsv (ev->cb, new_cb);
436 OUTPUT: 474 OUTPUT:
437 RETVAL 475 RETVAL
438 476
439SV *fh (Event ev, SV *new_fh = 0) 477SV *fh (Event ev, SV *new_fh = 0)
440 ALIAS:
441 signal = 0
442 CODE: 478 CODE:
443 RETVAL = newSVsv (ev->fh); 479 RETVAL = newSVsv (ev->fh);
444 if (items > 1) 480 if (items > 1)
445 { 481 {
446 if (ev->active) event_del (&ev->ev); 482 if (ev->active) event_del (&ev->ev);
447 sv_setsv (ev->fh, new_fh); 483 sv_setsv (ev->fh, new_fh);
448 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;
449 if (ev->active) event_add (&ev->ev, e_tv (ev)); 486 if (ev->active) event_add (&ev->ev, e_tv (ev));
450 } 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}
451 OUTPUT: 510 OUTPUT:
452 RETVAL 511 RETVAL
453 512
454short events (Event ev, short new_events = EV_UNDEF) 513short events (Event ev, short new_events = EV_UNDEF)
455 CODE: 514 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines