… | |
… | |
9 | #include "../Coro/CoroAPI.h" |
9 | #include "../Coro/CoroAPI.h" |
10 | |
10 | |
11 | #define CD_CORO 0 |
11 | #define CD_CORO 0 |
12 | #define CD_TYPE 1 |
12 | #define CD_TYPE 1 |
13 | #define CD_OK 2 |
13 | #define CD_OK 2 |
14 | #define CD_PRIO 3 /* hardcoded in Coro::Event */ |
14 | |
15 | #define CD_HITS 4 /* hardcoded in Coro::Event */ |
15 | #define CD_HITS 4 /* hardcoded in Coro::Event */ |
16 | #define CD_GOT 5 /* hardcoded in Coro::Event, Coro::Handle */ |
16 | #define CD_GOT 5 /* hardcoded in Coro::Event, Coro::Handle */ |
17 | #define CD_MAX 5 |
17 | #define CD_MAX 5 |
18 | |
18 | |
19 | static void |
19 | static void |
… | |
… | |
21 | { |
21 | { |
22 | AV *priv = (AV *)pe->ext_data; |
22 | AV *priv = (AV *)pe->ext_data; |
23 | IV type = SvIV (AvARRAY (priv)[CD_TYPE]); |
23 | IV type = SvIV (AvARRAY (priv)[CD_TYPE]); |
24 | SV **cd_coro; |
24 | SV **cd_coro; |
25 | |
25 | |
26 | SvIV_set (AvARRAY (priv)[CD_PRIO], pe->prio); |
|
|
27 | SvIV_set (AvARRAY (priv)[CD_HITS], pe->hits); |
26 | SvIV_set (AvARRAY (priv)[CD_HITS], pe->hits); |
28 | |
27 | |
29 | if (type == 1) |
28 | if (type == 1) |
30 | SvIV_set (AvARRAY (priv)[CD_GOT], ((pe_ioevent *)pe)->got); |
29 | SvIV_set (AvARRAY (priv)[CD_GOT], ((pe_ioevent *)pe)->got); |
31 | |
30 | |
… | |
… | |
78 | |
77 | |
79 | av_extend (priv, CD_MAX); |
78 | av_extend (priv, CD_MAX); |
80 | AvARRAY (priv)[CD_CORO] = &PL_sv_undef; |
79 | AvARRAY (priv)[CD_CORO] = &PL_sv_undef; |
81 | AvARRAY (priv)[CD_TYPE] = newSViv (type); |
80 | AvARRAY (priv)[CD_TYPE] = newSViv (type); |
82 | AvARRAY (priv)[CD_OK ] = &PL_sv_no; |
81 | AvARRAY (priv)[CD_OK ] = &PL_sv_no; |
83 | AvARRAY (priv)[CD_PRIO] = newSViv (0); |
|
|
84 | AvARRAY (priv)[CD_HITS] = newSViv (0); |
82 | AvARRAY (priv)[CD_HITS] = newSViv (0); |
85 | AvARRAY (priv)[CD_GOT ] = newSViv (0); |
83 | AvARRAY (priv)[CD_GOT ] = newSViv (0); |
86 | SvREADONLY_on (priv); |
84 | SvREADONLY_on (priv); |
87 | |
85 | |
88 | w->callback = coro_std_cb; |
86 | w->callback = coro_std_cb; |
… | |
… | |
106 | AvARRAY (priv)[CD_OK] = &PL_sv_no; |
104 | AvARRAY (priv)[CD_OK] = &PL_sv_no; |
107 | XSRETURN_NO; /* got an event */ |
105 | XSRETURN_NO; /* got an event */ |
108 | } |
106 | } |
109 | |
107 | |
110 | if (!w->running) |
108 | if (!w->running) |
|
|
109 | { |
|
|
110 | SvIV_set (AvARRAY (priv)[CD_GOT], 0); |
|
|
111 | SvIV_set (AvARRAY (priv)[CD_HITS], 0); |
|
|
112 | |
111 | GEventAPI->start (w, 1); |
113 | GEventAPI->start (w, 1); |
|
|
114 | } |
112 | |
115 | |
113 | if (AvARRAY (priv)[CD_CORO] == &PL_sv_undef) |
116 | if (AvARRAY (priv)[CD_CORO] == &PL_sv_undef) |
114 | AvARRAY (priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT); |
117 | AvARRAY (priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT); |
115 | else if (AvARRAY (priv)[CD_CORO] != CORO_CURRENT) |
118 | else if (AvARRAY (priv)[CD_CORO] != CORO_CURRENT) |
116 | croak ("Coro::Event::next can only be called from a single coroutine at a time, caught"); |
119 | croak ("Coro::Event::next can only be called from a single coroutine at a time, caught"); |
117 | |
120 | |
118 | XSRETURN_YES; /* schedule */ |
121 | XSRETURN_YES; /* schedule */ |
119 | } |
122 | } |
120 | |
123 | |
|
|
124 | SV * |
|
|
125 | _event (SV *self) |
|
|
126 | CODE: |
|
|
127 | { |
|
|
128 | if (GIMME_V == G_VOID) |
|
|
129 | XSRETURN_EMPTY; |
|
|
130 | |
|
|
131 | { |
|
|
132 | pe_watcher *w = GEventAPI->sv_2watcher (self); |
|
|
133 | AV *priv = (AV *)w->ext_data; |
|
|
134 | |
|
|
135 | RETVAL = newRV_inc ((SV *)priv); |
|
|
136 | } |
|
|
137 | } |
|
|
138 | OUTPUT: |
|
|
139 | RETVAL |
|
|
140 | |