… | |
… | |
88 | unsigned char cancelled; |
88 | unsigned char cancelled; |
89 | } aio_cb; |
89 | } aio_cb; |
90 | |
90 | |
91 | typedef aio_cb *aio_req; |
91 | typedef aio_cb *aio_req; |
92 | typedef aio_cb *aio_req_ornot; |
92 | typedef aio_cb *aio_req_ornot; |
93 | typedef aio_cb *aio_group; |
|
|
94 | |
93 | |
95 | static int started, wanted; |
94 | static int started, wanted; |
96 | static volatile int nreqs; |
95 | static volatile int nreqs; |
97 | static int max_outstanding = 1<<30; |
96 | static int max_outstanding = 1<<30; |
98 | static int respipe [2]; |
97 | static int respipe [2]; |
… | |
… | |
147 | |
146 | |
148 | errno = req->errorno; |
147 | errno = req->errorno; |
149 | |
148 | |
150 | ENTER; |
149 | ENTER; |
151 | PUSHMARK (SP); |
150 | PUSHMARK (SP); |
|
|
151 | EXTEND (SP, 1); |
152 | |
152 | |
153 | switch (req->type) |
153 | switch (req->type) |
154 | { |
154 | { |
155 | case REQ_READDIR: |
155 | case REQ_READDIR: |
156 | { |
156 | { |
… | |
… | |
171 | } |
171 | } |
172 | |
172 | |
173 | rv = sv_2mortal (newRV_noinc ((SV *)av)); |
173 | rv = sv_2mortal (newRV_noinc ((SV *)av)); |
174 | } |
174 | } |
175 | |
175 | |
176 | XPUSHs (rv); |
176 | PUSHs (rv); |
177 | } |
177 | } |
178 | break; |
178 | break; |
179 | |
179 | |
180 | case REQ_OPEN: |
180 | case REQ_OPEN: |
181 | { |
181 | { |
182 | /* convert fd to fh */ |
182 | /* convert fd to fh */ |
183 | SV *fh; |
183 | SV *fh; |
184 | |
184 | |
185 | XPUSHs (sv_2mortal (newSViv (req->result))); |
185 | PUSHs (sv_2mortal (newSViv (req->result))); |
186 | PUTBACK; |
186 | PUTBACK; |
187 | call_pv ("IO::AIO::_fd2fh", G_SCALAR | G_EVAL); |
187 | call_pv ("IO::AIO::_fd2fh", G_SCALAR | G_EVAL); |
188 | SPAGAIN; |
188 | SPAGAIN; |
189 | |
189 | |
190 | fh = SvREFCNT_inc (POPs); |
190 | fh = SvREFCNT_inc (POPs); |
… | |
… | |
192 | PUSHMARK (SP); |
192 | PUSHMARK (SP); |
193 | XPUSHs (sv_2mortal (fh)); |
193 | XPUSHs (sv_2mortal (fh)); |
194 | } |
194 | } |
195 | break; |
195 | break; |
196 | |
196 | |
|
|
197 | case REQ_GROUP: |
|
|
198 | if (req->data) |
|
|
199 | { |
|
|
200 | int i; |
|
|
201 | AV *av = (AV *)req->data; |
|
|
202 | |
|
|
203 | EXTEND (SP, AvFILL (av) + 1); |
|
|
204 | for (i = 0; i <= AvFILL (av); ++i) |
|
|
205 | PUSHs (*av_fetch (av, i, 0)); |
|
|
206 | } |
|
|
207 | break; |
|
|
208 | |
197 | case REQ_SLEEP: |
209 | case REQ_SLEEP: |
198 | case REQ_GROUP: |
|
|
199 | break; |
210 | break; |
200 | |
211 | |
201 | default: |
212 | default: |
202 | XPUSHs (sv_2mortal (newSViv (req->result))); |
213 | PUSHs (sv_2mortal (newSViv (req->result))); |
203 | break; |
214 | break; |
204 | } |
215 | } |
205 | |
216 | |
206 | |
217 | |
207 | PUTBACK; |
218 | PUTBACK; |
… | |
… | |
227 | |
238 | |
228 | /* unlink request */ |
239 | /* unlink request */ |
229 | req->grp_next->grp_prev = req->grp_prev; |
240 | req->grp_next->grp_prev = req->grp_prev; |
230 | req->grp_prev->grp_next = req->grp_next; |
241 | req->grp_prev->grp_next = req->grp_next; |
231 | |
242 | |
232 | if (grp->grp_next == grp) |
243 | if (grp->grp_next == grp && grp->fd) |
233 | { |
244 | { |
234 | req_invoke (grp); |
245 | req_invoke (grp); |
235 | req_free (grp); |
246 | req_free (grp); |
236 | } |
247 | } |
237 | } |
248 | } |
… | |
… | |
311 | nreqs--; |
322 | nreqs--; |
312 | |
323 | |
313 | if (req->type == REQ_QUIT) |
324 | if (req->type == REQ_QUIT) |
314 | started--; |
325 | started--; |
315 | else if (req->type == REQ_GROUP && req->grp_next != req) |
326 | else if (req->type == REQ_GROUP && req->grp_next != req) |
|
|
327 | { |
|
|
328 | req->fd = 1; /* mark request as delayed */ |
316 | continue; |
329 | continue; |
|
|
330 | } |
317 | else |
331 | else |
318 | { |
332 | { |
319 | if (req->type == REQ_READ) |
333 | if (req->type == REQ_READ) |
320 | SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0)); |
334 | SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0)); |
321 | |
335 | |
… | |
… | |
1142 | } |
1156 | } |
1143 | |
1157 | |
1144 | void |
1158 | void |
1145 | aio_group (callback=&PL_sv_undef) |
1159 | aio_group (callback=&PL_sv_undef) |
1146 | SV * callback |
1160 | SV * callback |
1147 | PROTOTYPE: ;& |
1161 | PROTOTYPE: ;$ |
1148 | PPCODE: |
1162 | PPCODE: |
1149 | { |
1163 | { |
1150 | dREQ; |
1164 | dREQ; |
1151 | req->type = REQ_GROUP; |
1165 | req->type = REQ_GROUP; |
1152 | req->grp_next = req; |
1166 | req->grp_next = req; |
… | |
… | |
1205 | CODE: |
1219 | CODE: |
1206 | RETVAL = nreqs; |
1220 | RETVAL = nreqs; |
1207 | OUTPUT: |
1221 | OUTPUT: |
1208 | RETVAL |
1222 | RETVAL |
1209 | |
1223 | |
|
|
1224 | PROTOTYPES: DISABLE |
|
|
1225 | |
1210 | MODULE = IO::AIO PACKAGE = IO::AIO::REQ |
1226 | MODULE = IO::AIO PACKAGE = IO::AIO::REQ |
1211 | |
1227 | |
1212 | void |
1228 | void |
1213 | cancel (aio_req_ornot req) |
1229 | cancel (aio_req_ornot req) |
1214 | PROTOTYPE: |
1230 | PROTOTYPE: |
… | |
… | |
1217 | |
1233 | |
1218 | MODULE = IO::AIO PACKAGE = IO::AIO::GRP |
1234 | MODULE = IO::AIO PACKAGE = IO::AIO::GRP |
1219 | |
1235 | |
1220 | void |
1236 | void |
1221 | add (aio_req grp, ...) |
1237 | add (aio_req grp, ...) |
1222 | PROTOTYPE: $;@ |
|
|
1223 | PPCODE: |
1238 | PPCODE: |
1224 | { |
1239 | { |
1225 | int i; |
1240 | int i; |
1226 | |
1241 | |
1227 | for (i = 1; i < items; ++i ) |
1242 | for (i = 1; i < items; ++i ) |
1228 | { |
1243 | { |
1229 | aio_req req = SvAIO_REQ (ST (i)); |
|
|
1230 | |
|
|
1231 | req->grp_prev = grp; |
|
|
1232 | req->grp_next = grp->grp_next; |
|
|
1233 | grp->grp_next->grp_prev = req; |
|
|
1234 | grp->grp_next = req; |
|
|
1235 | |
|
|
1236 | req->grp = grp; |
|
|
1237 | |
|
|
1238 | if (GIMME_V != G_VOID) |
1244 | if (GIMME_V != G_VOID) |
1239 | XPUSHs (sv_2mortal (newSVsv (ST (i)))); |
1245 | XPUSHs (sv_2mortal (newSVsv (ST (i)))); |
|
|
1246 | |
|
|
1247 | aio_req req = SvAIO_REQ (ST (i)); |
|
|
1248 | |
|
|
1249 | if (req) |
|
|
1250 | { |
|
|
1251 | req->grp_prev = grp; |
|
|
1252 | req->grp_next = grp->grp_next; |
|
|
1253 | grp->grp_next->grp_prev = req; |
|
|
1254 | grp->grp_next = req; |
|
|
1255 | |
|
|
1256 | req->grp = grp; |
|
|
1257 | } |
1240 | } |
1258 | } |
1241 | } |
1259 | } |
1242 | |
1260 | |
|
|
1261 | void |
|
|
1262 | result (aio_req grp, ...) |
|
|
1263 | CODE: |
|
|
1264 | { |
|
|
1265 | int i; |
|
|
1266 | AV *av = newAV (); |
|
|
1267 | |
|
|
1268 | if (grp->data) |
|
|
1269 | SvREFCNT_dec (grp->data); |
|
|
1270 | |
|
|
1271 | for (i = 1; i < items; ++i ) |
|
|
1272 | av_push (av, newSVsv (ST (i))); |
|
|
1273 | |
|
|
1274 | grp->data = (SV *)av; |
|
|
1275 | } |
|
|
1276 | |