… | |
… | |
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]; |
… | |
… | |
227 | |
226 | |
228 | /* unlink request */ |
227 | /* unlink request */ |
229 | req->grp_next->grp_prev = req->grp_prev; |
228 | req->grp_next->grp_prev = req->grp_prev; |
230 | req->grp_prev->grp_next = req->grp_next; |
229 | req->grp_prev->grp_next = req->grp_next; |
231 | |
230 | |
232 | if (grp->grp_next == grp) |
231 | if (grp->grp_next == grp && grp->fd) |
233 | { |
232 | { |
234 | req_invoke (grp); |
233 | req_invoke (grp); |
235 | req_free (grp); |
234 | req_free (grp); |
236 | } |
235 | } |
237 | } |
236 | } |
… | |
… | |
311 | nreqs--; |
310 | nreqs--; |
312 | |
311 | |
313 | if (req->type == REQ_QUIT) |
312 | if (req->type == REQ_QUIT) |
314 | started--; |
313 | started--; |
315 | else if (req->type == REQ_GROUP && req->grp_next != req) |
314 | else if (req->type == REQ_GROUP && req->grp_next != req) |
|
|
315 | { |
|
|
316 | req->fd = 1; /* mark request as delayed */ |
316 | continue; |
317 | continue; |
|
|
318 | } |
317 | else |
319 | else |
318 | { |
320 | { |
319 | if (req->type == REQ_READ) |
321 | if (req->type == REQ_READ) |
320 | SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0)); |
322 | SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0)); |
321 | |
323 | |
… | |
… | |
1142 | } |
1144 | } |
1143 | |
1145 | |
1144 | void |
1146 | void |
1145 | aio_group (callback=&PL_sv_undef) |
1147 | aio_group (callback=&PL_sv_undef) |
1146 | SV * callback |
1148 | SV * callback |
1147 | PROTOTYPE: ;& |
1149 | PROTOTYPE: ;$ |
1148 | PPCODE: |
1150 | PPCODE: |
1149 | { |
1151 | { |
1150 | dREQ; |
1152 | dREQ; |
1151 | req->type = REQ_GROUP; |
1153 | req->type = REQ_GROUP; |
1152 | req->grp_next = req; |
1154 | req->grp_next = req; |
… | |
… | |
1224 | { |
1226 | { |
1225 | int i; |
1227 | int i; |
1226 | |
1228 | |
1227 | for (i = 1; i < items; ++i ) |
1229 | for (i = 1; i < items; ++i ) |
1228 | { |
1230 | { |
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) |
1231 | if (GIMME_V != G_VOID) |
1239 | XPUSHs (sv_2mortal (newSVsv (ST (i)))); |
1232 | XPUSHs (sv_2mortal (newSVsv (ST (i)))); |
|
|
1233 | |
|
|
1234 | aio_req req = SvAIO_REQ (ST (i)); |
|
|
1235 | |
|
|
1236 | if (req) |
|
|
1237 | { |
|
|
1238 | req->grp_prev = grp; |
|
|
1239 | req->grp_next = grp->grp_next; |
|
|
1240 | grp->grp_next->grp_prev = req; |
|
|
1241 | grp->grp_next = req; |
|
|
1242 | |
|
|
1243 | req->grp = grp; |
|
|
1244 | } |
1240 | } |
1245 | } |
1241 | } |
1246 | } |
1242 | |
1247 | |