--- EV/EV.xs 2010/03/16 20:43:05 1.137 +++ EV/EV.xs 2010/04/14 00:17:22 1.138 @@ -35,23 +35,27 @@ # include #endif -#define e_loop(w) INT2PTR (struct ev_loop *, SvIVX ((w)->loop)) +#define e_loop(w) INT2PTR (struct ev_loop *, SvIVX (((ev_watcher *)(w))->loop)) +#define e_flags(w) ((ev_watcher *)(w))->e_flags +#define e_self(w) ((ev_watcher *)(w))->self +#define e_fh(w) ((ev_watcher *)(w))->fh +#define e_data(w) ((ev_watcher *)(w))->data #define WFLAG_KEEPALIVE 1 #define WFLAG_UNREFED 2 /* has been unref'ed */ #define UNREF(w) \ - if (!((w)->e_flags & (WFLAG_KEEPALIVE | WFLAG_UNREFED)) \ + if (!(e_flags (w) & (WFLAG_KEEPALIVE | WFLAG_UNREFED)) \ && ev_is_active (w)) \ { \ ev_unref (e_loop (w)); \ - (w)->e_flags |= WFLAG_UNREFED; \ + e_flags (w) |= WFLAG_UNREFED; \ } #define REF(w) \ - if ((w)->e_flags & WFLAG_UNREFED) \ + if (e_flags (w) & WFLAG_UNREFED) \ { \ - (w)->e_flags &= ~WFLAG_UNREFED; \ + e_flags (w) &= ~WFLAG_UNREFED; \ ev_ref (e_loop (w)); \ } @@ -125,7 +129,7 @@ static void e_cb (EV_P_ ev_watcher *w, int revents); -static void * +void * e_new (int size, SV *cb_sv, SV *loop) { SV *cv = cb_sv ? s_get_cv_croak (cb_sv) : 0; @@ -197,7 +201,7 @@ } else { - sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */ + sv_self = newRV_inc (w->self); /* e_self (w) MUST be blessed by now */ SvREADONLY_on (sv_self); } @@ -298,7 +302,7 @@ PUSHMARK (SP); EXTEND (SP, 2); - PUSHs (newRV_inc (w->self)); /* w->self MUST be blessed by now */ + PUSHs (newRV_inc (e_self (w))); /* e_self (w) MUST be blessed by now */ PUSHs (newSVnv (now)); PUTBACK; @@ -600,7 +604,7 @@ } RETVAL = e_new (sizeof (ev_io), cb, default_loop_sv); - RETVAL->fh = newSVsv (fh); + e_fh (RETVAL) = newSVsv (fh); ev_io_set (RETVAL, fd, events); if (!ix) START (io, RETVAL); } @@ -628,8 +632,8 @@ { ev_periodic *w; w = e_new (sizeof (ev_periodic), cb, default_loop_sv); - w->fh = SvTRUE (reschedule_cb) ? newSVsv (reschedule_cb) : 0; - ev_periodic_set (w, at, interval, w->fh ? e_periodic_cb : 0); + e_fh (w) = SvTRUE (reschedule_cb) ? newSVsv (reschedule_cb) : 0; + ev_periodic_set (w, at, interval, e_fh (w) ? e_periodic_cb : 0); RETVAL = e_bless ((ev_watcher *)w, stash_periodic); if (!ix) START (periodic, w); } @@ -706,8 +710,8 @@ stat_ns = 1 CODE: RETVAL = e_new (sizeof (ev_stat), cb, default_loop_sv); - RETVAL->fh = newSVsv (path); - ev_stat_set (RETVAL, SvPVbyte_nolen (RETVAL->fh), interval); + e_fh (RETVAL) = newSVsv (path); + ev_stat_set (RETVAL, SvPVbyte_nolen (e_fh (RETVAL)), interval); if (!ix) START (stat, RETVAL); OUTPUT: RETVAL @@ -721,7 +725,7 @@ croak ("passed loop is not embeddable via EV::embed,"); RETVAL = e_new (sizeof (ev_embed), cb, default_loop_sv); - RETVAL->fh = newSVsv (ST (0)); + e_fh (RETVAL) = newSVsv (ST (0)); ev_embed_set (RETVAL, loop); if (!ix) START (embed, RETVAL); } @@ -869,7 +873,7 @@ int fd = s_fileno (fh, events & EV_WRITE); CHECK_FD (fh, fd); - sv_setsv (w->fh, fh); + sv_setsv (e_fh (w), fh); RESET (io, w, (w, fd, events)); } @@ -881,13 +885,13 @@ int fd = s_fileno (new_fh, w->events & EV_WRITE); CHECK_FD (new_fh, fd); - RETVAL = w->fh; - w->fh = newSVsv (new_fh); + RETVAL = e_fh (w); + e_fh (w) = newSVsv (new_fh); RESET (io, w, (w, fd, w->events)); } else - RETVAL = newSVsv (w->fh); + RETVAL = newSVsv (e_fh (w)); } OUTPUT: RETVAL @@ -1003,10 +1007,10 @@ CHECK_REPEAT (interval); CODE: { - SvREFCNT_dec (w->fh); - w->fh = SvTRUE (reschedule_cb) ? newSVsv (reschedule_cb) : 0; + SvREFCNT_dec (e_fh (w)); + e_fh (w) = SvTRUE (reschedule_cb) ? newSVsv (reschedule_cb) : 0; - RESET (periodic, w, (w, at, interval, w->fh ? e_periodic_cb : 0)); + RESET (periodic, w, (w, at, interval, e_fh (w) ? e_periodic_cb : 0)); } NV at (ev_periodic *w) @@ -1123,20 +1127,20 @@ void set (ev_stat *w, SV *path, NV interval) CODE: { - sv_setsv (w->fh, path); - RESET (stat, w, (w, SvPVbyte_nolen (w->fh), interval)); + sv_setsv (e_fh (w), path); + RESET (stat, w, (w, SvPVbyte_nolen (e_fh (w)), interval)); } SV *path (ev_stat *w, SV *new_path = 0) CODE: { - RETVAL = SvREFCNT_inc (w->fh); + RETVAL = SvREFCNT_inc (e_fh (w)); if (items > 1) { - SvREFCNT_dec (w->fh); - w->fh = newSVsv (new_path); - RESET (stat, w, (w, SvPVbyte_nolen (w->fh), w->interval)); + SvREFCNT_dec (e_fh (w)); + e_fh (w) = newSVsv (new_path); + RESET (stat, w, (w, SvPVbyte_nolen (e_fh (w)), w->interval)); } } OUTPUT: @@ -1148,7 +1152,7 @@ RETVAL = w->interval; if (items > 1) - RESET (stat, w, (w, SvPVbyte_nolen (w->fh), new_interval)); + RESET (stat, w, (w, SvPVbyte_nolen (e_fh (w)), new_interval)); } OUTPUT: RETVAL @@ -1217,13 +1221,13 @@ void set (ev_embed *w, struct ev_loop *loop) CODE: { - sv_setsv (w->fh, ST (1)); + sv_setsv (e_fh (w), ST (1)); RESET (embed, w, (w, loop)); } SV *other (ev_embed *w) CODE: - RETVAL = newSVsv (w->fh); + RETVAL = newSVsv (e_fh (w)); OUTPUT: RETVAL @@ -1328,7 +1332,7 @@ CHECK_FD (fh, fd); RETVAL = e_new (sizeof (ev_io), cb, ST (0)); - RETVAL->fh = newSVsv (fh); + e_fh (RETVAL) = newSVsv (fh); ev_io_set (RETVAL, fd, events); if (!ix) START (io, RETVAL); } @@ -1356,8 +1360,8 @@ { ev_periodic *w; w = e_new (sizeof (ev_periodic), cb, ST (0)); - w->fh = SvTRUE (reschedule_cb) ? newSVsv (reschedule_cb) : 0; - ev_periodic_set (w, at, interval, w->fh ? e_periodic_cb : 0); + e_fh (w) = SvTRUE (reschedule_cb) ? newSVsv (reschedule_cb) : 0; + ev_periodic_set (w, at, interval, e_fh (w) ? e_periodic_cb : 0); RETVAL = e_bless ((ev_watcher *)w, stash_periodic); if (!ix) START (periodic, w); } @@ -1434,8 +1438,8 @@ stat_ns = 1 CODE: RETVAL = e_new (sizeof (ev_stat), cb, ST (0)); - RETVAL->fh = newSVsv (path); - ev_stat_set (RETVAL, SvPVbyte_nolen (RETVAL->fh), interval); + e_fh (RETVAL) = newSVsv (path); + ev_stat_set (RETVAL, SvPVbyte_nolen (e_fh (RETVAL)), interval); if (!ix) START (stat, RETVAL); OUTPUT: RETVAL @@ -1449,7 +1453,7 @@ croak ("passed loop is not embeddable via EV::embed,"); RETVAL = e_new (sizeof (ev_embed), cb, ST (0)); - RETVAL->fh = newSVsv (ST (1)); + e_fh (RETVAL) = newSVsv (ST (1)); ev_embed_set (RETVAL, other); if (!ix) START (embed, RETVAL); }