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

Comparing EV/EV.xs (file contents):
Revision 1.30 by root, Thu Nov 1 08:10:03 2007 UTC vs.
Revision 1.32 by root, Thu Nov 1 11:11:39 2007 UTC

30static int 30static int
31sv_signum (SV *sig) 31sv_signum (SV *sig)
32{ 32{
33 int signum; 33 int signum;
34 34
35 if (SvIV (sig) > 0) 35 SvGETMAGIC (sig);
36 return SvIV (sig);
37 36
38 for (signum = 1; signum < SIG_SIZE; ++signum) 37 for (signum = 1; signum < SIG_SIZE; ++signum)
39 if (strEQ (SvPV_nolen (sig), PL_sig_name [signum])) 38 if (strEQ (SvPV_nolen (sig), PL_sig_name [signum]))
40 return signum; 39 return signum;
41 40
41 if (SvIV (sig) > 0)
42 return SvIV (sig);
43
42 return -1; 44 return -1;
43} 45}
44 46
45///////////////////////////////////////////////////////////////////////////// 47/////////////////////////////////////////////////////////////////////////////
46// Event 48// Event
56 fh = SvRV (fh); 58 fh = SvRV (fh);
57 59
58 if (SvTYPE (fh) == SVt_PVGV) 60 if (SvTYPE (fh) == SVt_PVGV)
59 return PerlIO_fileno (IoIFP (sv_2io (fh))); 61 return PerlIO_fileno (IoIFP (sv_2io (fh)));
60 62
61 if (SvIOK (fh)) 63 if ((SvIV (fh) >= 0) && (SvIV (fh) < 0x7ffffff))
62 return SvIV (fh); 64 return SvIV (fh);
63 65
64 return -1; 66 return -1;
65} 67}
66 68
201} 203}
202#endif 204#endif
203 205
204#define CHECK_REPEAT(repeat) if (repeat < 0.) \ 206#define CHECK_REPEAT(repeat) if (repeat < 0.) \
205 croak (# repeat " value must be >= 0"); 207 croak (# repeat " value must be >= 0");
208
209#define CHECK_FD(fh,fd) if ((fd) < 0) \
210 croak ("illegal file descriptor or filehandle (either no attached file descriptor or illegal value): %s", SvPV_nolen (fh));
206 211
207///////////////////////////////////////////////////////////////////////////// 212/////////////////////////////////////////////////////////////////////////////
208// XS interface functions 213// XS interface functions
209 214
210MODULE = EV PACKAGE = EV PREFIX = ev_ 215MODULE = EV PACKAGE = EV PREFIX = ev_
314 319
315struct ev_io *io (SV *fh, int events, SV *cb) 320struct ev_io *io (SV *fh, int events, SV *cb)
316 ALIAS: 321 ALIAS:
317 io_ns = 1 322 io_ns = 1
318 CODE: 323 CODE:
324{
325 int fd = sv_fileno (fh);
326 CHECK_FD (fh, fd);
327
319 RETVAL = e_new (sizeof (struct ev_io), cb); 328 RETVAL = e_new (sizeof (struct ev_io), cb);
320 RETVAL->fh = newSVsv (fh); 329 RETVAL->fh = newSVsv (fh);
321 ev_io_set (RETVAL, sv_fileno (RETVAL->fh), events); 330 ev_io_set (RETVAL, fd, events);
322 if (!ix) ev_io_start (RETVAL); 331 if (!ix) ev_io_start (RETVAL);
332}
323 OUTPUT: 333 OUTPUT:
324 RETVAL 334 RETVAL
325 335
326struct ev_timer *timer (NV after, NV repeat, SV *cb) 336struct ev_timer *timer (NV after, NV repeat, SV *cb)
327 ALIAS: 337 ALIAS:
431 441
432void set (struct ev_io *w, SV *fh, int events) 442void set (struct ev_io *w, SV *fh, int events)
433 CODE: 443 CODE:
434{ 444{
435 int active = w->active; 445 int active = w->active;
446 int fd = sv_fileno (fh);
447 CHECK_FD (fh, fd);
448
436 if (active) ev_io_stop (w); 449 if (active) ev_io_stop (w);
437 450
438 sv_setsv (w->fh, fh); 451 sv_setsv (w->fh, fh);
439 ev_io_set (w, sv_fileno (w->fh), events); 452 ev_io_set (w, fd, events);
440 453
441 if (active) ev_io_start (w); 454 if (active) ev_io_start (w);
442} 455}
443 456
444SV *fh (struct ev_io *w, SV *new_fh = 0) 457SV *fh (struct ev_io *w, SV *new_fh = 0)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines