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.33 by root, Thu Nov 1 11:55:54 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_
286 evapi.child_stop = ev_child_stop; 291 evapi.child_stop = ev_child_stop;
287 292
288 sv_setiv (sv, (IV)&evapi); 293 sv_setiv (sv, (IV)&evapi);
289 SvREADONLY_on (sv); 294 SvREADONLY_on (sv);
290 } 295 }
296
297 pthread_atfork (ev_fork_prepare, ev_fork_parent, ev_fork_child);
291} 298}
292 299
293NV ev_now () 300NV ev_now ()
294 CODE: 301 CODE:
295 RETVAL = ev_now; 302 RETVAL = ev_now;
314 321
315struct ev_io *io (SV *fh, int events, SV *cb) 322struct ev_io *io (SV *fh, int events, SV *cb)
316 ALIAS: 323 ALIAS:
317 io_ns = 1 324 io_ns = 1
318 CODE: 325 CODE:
326{
327 int fd = sv_fileno (fh);
328 CHECK_FD (fh, fd);
329
319 RETVAL = e_new (sizeof (struct ev_io), cb); 330 RETVAL = e_new (sizeof (struct ev_io), cb);
320 RETVAL->fh = newSVsv (fh); 331 RETVAL->fh = newSVsv (fh);
321 ev_io_set (RETVAL, sv_fileno (RETVAL->fh), events); 332 ev_io_set (RETVAL, fd, events);
322 if (!ix) ev_io_start (RETVAL); 333 if (!ix) ev_io_start (RETVAL);
334}
323 OUTPUT: 335 OUTPUT:
324 RETVAL 336 RETVAL
325 337
326struct ev_timer *timer (NV after, NV repeat, SV *cb) 338struct ev_timer *timer (NV after, NV repeat, SV *cb)
327 ALIAS: 339 ALIAS:
431 443
432void set (struct ev_io *w, SV *fh, int events) 444void set (struct ev_io *w, SV *fh, int events)
433 CODE: 445 CODE:
434{ 446{
435 int active = w->active; 447 int active = w->active;
448 int fd = sv_fileno (fh);
449 CHECK_FD (fh, fd);
450
436 if (active) ev_io_stop (w); 451 if (active) ev_io_stop (w);
437 452
438 sv_setsv (w->fh, fh); 453 sv_setsv (w->fh, fh);
439 ev_io_set (w, sv_fileno (w->fh), events); 454 ev_io_set (w, fd, events);
440 455
441 if (active) ev_io_start (w); 456 if (active) ev_io_start (w);
442} 457}
443 458
444SV *fh (struct ev_io *w, SV *new_fh = 0) 459SV *fh (struct ev_io *w, SV *new_fh = 0)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines