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

Comparing EV/EV.xs (file contents):
Revision 1.120 by root, Sun Nov 23 17:44:46 2008 UTC vs.
Revision 1.121 by root, Wed Apr 15 17:49:26 2009 UTC

46#define expect_true(expr) expect ((expr) != 0, 1) 46#define expect_true(expr) expect ((expr) != 0, 1)
47 47
48#define e_loop(w) INT2PTR (struct ev_loop *, SvIVX ((w)->loop)) 48#define e_loop(w) INT2PTR (struct ev_loop *, SvIVX ((w)->loop))
49 49
50#define WFLAG_KEEPALIVE 1 50#define WFLAG_KEEPALIVE 1
51#define WFLAG_UNREFED 2 /* has been unref'ed */
51 52
52#define UNREF(w) \ 53#define UNREF(w) \
53 if (!((w)->e_flags & WFLAG_KEEPALIVE) \ 54 if (!((w)->e_flags & (WFLAG_KEEPALIVE | WFLAG_UNREFED)) \
54 && !ev_is_active (w)) \ 55 && ev_is_active (w)) \
56 { \
55 ev_unref (e_loop (w)); 57 ev_unref (e_loop (w)); \
58 (w)->e_flags |= WFLAG_UNREFED; \
59 }
56 60
57#define REF(w) \ 61#define REF(w) \
58 if (!((w)->e_flags & WFLAG_KEEPALIVE) \ 62 if ((w)->e_flags & WFLAG_UNREFED) \
59 && ev_is_active (w)) \ 63 { \
64 (w)->e_flags &= ~WFLAG_UNREFED; \
60 ev_ref (e_loop (w)); 65 ev_ref (e_loop (w)); \
66 }
61 67
62#define START(type,w) \ 68#define START(type,w) \
63 do { \ 69 do { \
70 ev_ ## type ## _start (e_loop (w), w); \
64 UNREF (w); \ 71 UNREF (w); \
65 ev_ ## type ## _start (e_loop (w), w); \
66 } while (0) 72 } while (0)
67 73
68#define STOP(type,w) \ 74#define STOP(type,w) \
69 do { \ 75 do { \
70 REF (w); \ 76 REF (w); \
218e_cb (EV_P_ ev_watcher *w, int revents) 224e_cb (EV_P_ ev_watcher *w, int revents)
219{ 225{
220 dSP; 226 dSP;
221 I32 mark = SP - PL_stack_base; 227 I32 mark = SP - PL_stack_base;
222 SV *sv_self, *sv_events; 228 SV *sv_self, *sv_events;
229
230 /* libev might have stopped the watcher */
231 if (expect_false (w->e_flags & WFLAG_UNREFED)
232 && !ev_is_active (w))
233 REF (w);
223 234
224 if (expect_true (sv_self_cache)) 235 if (expect_true (sv_self_cache))
225 { 236 {
226 sv_self = sv_self_cache; sv_self_cache = 0; 237 sv_self = sv_self_cache; sv_self_cache = 0;
227 SvRV_set (sv_self, SvREFCNT_inc_NN (w->self)); 238 SvRV_set (sv_self, SvREFCNT_inc_NN (w->self));
747 RETVAL = w->e_flags & WFLAG_KEEPALIVE; 758 RETVAL = w->e_flags & WFLAG_KEEPALIVE;
748 new_value = new_value ? WFLAG_KEEPALIVE : 0; 759 new_value = new_value ? WFLAG_KEEPALIVE : 0;
749 760
750 if (items > 1 && ((new_value ^ w->e_flags) & WFLAG_KEEPALIVE)) 761 if (items > 1 && ((new_value ^ w->e_flags) & WFLAG_KEEPALIVE))
751 { 762 {
763 w->e_flags = (w->e_flags & ~WFLAG_KEEPALIVE) | new_value;
752 REF (w); 764 REF (w);
753 w->e_flags = (w->e_flags & ~WFLAG_KEEPALIVE) | new_value;
754 UNREF (w); 765 UNREF (w);
755 } 766 }
756} 767}
757 OUTPUT: 768 OUTPUT:
758 RETVAL 769 RETVAL
933 944
934void ev_timer_again (ev_timer *w) 945void ev_timer_again (ev_timer *w)
935 INIT: 946 INIT:
936 CHECK_REPEAT (w->repeat); 947 CHECK_REPEAT (w->repeat);
937 CODE: 948 CODE:
938 REF (w);
939 ev_timer_again (e_loop (w), w); 949 ev_timer_again (e_loop (w), w);
940 UNREF (w); 950 UNREF (w);
941 951
942void DESTROY (ev_timer *w) 952void DESTROY (ev_timer *w)
943 CODE: 953 CODE:
962 CODE: 972 CODE:
963 STOP (periodic, w); 973 STOP (periodic, w);
964 974
965void ev_periodic_again (ev_periodic *w) 975void ev_periodic_again (ev_periodic *w)
966 CODE: 976 CODE:
967 REF (w);
968 ev_periodic_again (e_loop (w), w); 977 ev_periodic_again (e_loop (w), w);
969 UNREF (w); 978 UNREF (w);
970 979
971void DESTROY (ev_periodic *w) 980void DESTROY (ev_periodic *w)
972 CODE: 981 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines