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.31 by root, Thu Nov 1 11:11:21 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
105{ 107{
106 dSP; 108 dSP;
107 I32 mark = SP - PL_stack_base; 109 I32 mark = SP - PL_stack_base;
108 SV *sv_self, *sv_events, *sv_status = 0; 110 SV *sv_self, *sv_events, *sv_status = 0;
109 static SV *sv_events_cache; 111 static SV *sv_events_cache;
112
113 fprintf (stderr, "e_cb %p,%x\n", w, revents);//D
110 114
111 sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */ 115 sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */
112 116
113 if (sv_events_cache) 117 if (sv_events_cache)
114 { 118 {
201} 205}
202#endif 206#endif
203 207
204#define CHECK_REPEAT(repeat) if (repeat < 0.) \ 208#define CHECK_REPEAT(repeat) if (repeat < 0.) \
205 croak (# repeat " value must be >= 0"); 209 croak (# repeat " value must be >= 0");
210
211#define CHECK_FD(fh,fd) if ((fd) < 0) \
212 croak ("illegal file descriptor or filehandle (either no attached file descriptor or illegal value): %s", SvPV_nolen (fh));
206 213
207///////////////////////////////////////////////////////////////////////////// 214/////////////////////////////////////////////////////////////////////////////
208// XS interface functions 215// XS interface functions
209 216
210MODULE = EV PACKAGE = EV PREFIX = ev_ 217MODULE = EV PACKAGE = EV PREFIX = ev_
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