… | |
… | |
55 | REQ_STAT, REQ_LSTAT, REQ_FSTAT, |
55 | REQ_STAT, REQ_LSTAT, REQ_FSTAT, |
56 | REQ_FSYNC, REQ_FDATASYNC, |
56 | REQ_FSYNC, REQ_FDATASYNC, |
57 | REQ_UNLINK, REQ_RMDIR, REQ_RENAME, |
57 | REQ_UNLINK, REQ_RMDIR, REQ_RENAME, |
58 | REQ_READDIR, |
58 | REQ_READDIR, |
59 | REQ_LINK, REQ_SYMLINK, |
59 | REQ_LINK, REQ_SYMLINK, |
|
|
60 | REQ_GROUP, REQ_NOP, |
60 | REQ_SLEEP, |
61 | REQ_SLEEP, |
61 | REQ_GROUP, |
|
|
62 | }; |
62 | }; |
63 | |
63 | |
64 | #define AIO_REQ_KLASS "IO::AIO::REQ" |
64 | #define AIO_REQ_KLASS "IO::AIO::REQ" |
65 | #define AIO_GRP_KLASS "IO::AIO::GRP" |
65 | #define AIO_GRP_KLASS "IO::AIO::GRP" |
66 | |
66 | |
… | |
… | |
259 | for (i = 0; i <= AvFILL (av); ++i) |
259 | for (i = 0; i <= AvFILL (av); ++i) |
260 | PUSHs (*av_fetch (av, i, 0)); |
260 | PUSHs (*av_fetch (av, i, 0)); |
261 | } |
261 | } |
262 | break; |
262 | break; |
263 | |
263 | |
|
|
264 | case REQ_NOP: |
264 | case REQ_SLEEP: |
265 | case REQ_SLEEP: |
265 | break; |
266 | break; |
266 | |
267 | |
267 | default: |
268 | default: |
268 | PUSHs (sv_2mortal (newSViv (req->result))); |
269 | PUSHs (sv_2mortal (newSViv (req->result))); |
… | |
… | |
820 | tv.tv_usec = req->fd2; |
821 | tv.tv_usec = req->fd2; |
821 | |
822 | |
822 | req->result = select (0, 0, 0, 0, &tv); |
823 | req->result = select (0, 0, 0, 0, &tv); |
823 | } |
824 | } |
824 | |
825 | |
|
|
826 | case REQ_GROUP: |
|
|
827 | case REQ_NOP: |
825 | case REQ_QUIT: |
828 | case REQ_QUIT: |
826 | break; |
829 | break; |
827 | |
830 | |
828 | default: |
831 | default: |
829 | req->result = ENOSYS; |
832 | req->result = ENOSYS; |
… | |
… | |
1212 | req_send (req); |
1215 | req_send (req); |
1213 | XPUSHs (req_sv (req, AIO_GRP_KLASS)); |
1216 | XPUSHs (req_sv (req, AIO_GRP_KLASS)); |
1214 | } |
1217 | } |
1215 | |
1218 | |
1216 | void |
1219 | void |
|
|
1220 | aio_nop (callback=&PL_sv_undef) |
|
|
1221 | SV * callback |
|
|
1222 | PPCODE: |
|
|
1223 | { |
|
|
1224 | dREQ; |
|
|
1225 | |
|
|
1226 | req->type = REQ_NOP; |
|
|
1227 | |
|
|
1228 | REQ_SEND; |
|
|
1229 | } |
|
|
1230 | |
|
|
1231 | void |
1217 | flush () |
1232 | flush () |
1218 | PROTOTYPE: |
1233 | PROTOTYPE: |
1219 | CODE: |
1234 | CODE: |
1220 | while (nreqs) |
1235 | while (nreqs) |
1221 | { |
1236 | { |
… | |
… | |
1272 | cancel (aio_req_ornot req) |
1287 | cancel (aio_req_ornot req) |
1273 | PROTOTYPE: |
1288 | PROTOTYPE: |
1274 | CODE: |
1289 | CODE: |
1275 | req_cancel (req); |
1290 | req_cancel (req); |
1276 | |
1291 | |
|
|
1292 | void |
|
|
1293 | cb (aio_req req, SV *callback=&PL_sv_undef) |
|
|
1294 | CODE: |
|
|
1295 | SvREFCNT_dec (req->callback); |
|
|
1296 | req->callback = newSVsv (callback); |
|
|
1297 | |
1277 | MODULE = IO::AIO PACKAGE = IO::AIO::GRP |
1298 | MODULE = IO::AIO PACKAGE = IO::AIO::GRP |
1278 | |
1299 | |
1279 | void |
1300 | void |
1280 | add (aio_req grp, ...) |
1301 | add (aio_req grp, ...) |
1281 | PPCODE: |
1302 | PPCODE: |
… | |
… | |
1322 | SvREFCNT_dec (grp->data); |
1343 | SvREFCNT_dec (grp->data); |
1323 | grp->data = (SV *)av; |
1344 | grp->data = (SV *)av; |
1324 | } |
1345 | } |
1325 | |
1346 | |
1326 | void |
1347 | void |
1327 | lock (aio_req grp) |
|
|
1328 | CODE: |
|
|
1329 | ++grp->length; |
|
|
1330 | |
|
|
1331 | void |
|
|
1332 | unlock (aio_req grp) |
|
|
1333 | CODE: |
|
|
1334 | aio_grp_dec (grp); |
|
|
1335 | |
|
|
1336 | void |
|
|
1337 | feeder_limit (aio_req grp, int limit) |
1348 | feed_limit (aio_req grp, int limit) |
1338 | CODE: |
1349 | CODE: |
1339 | grp->fd2 = limit; |
1350 | grp->fd2 = limit; |
1340 | aio_grp_feed (grp); |
1351 | aio_grp_feed (grp); |
1341 | |
1352 | |
1342 | void |
1353 | void |
1343 | set_feeder (aio_req grp, SV *callback=&PL_sv_undef) |
1354 | feed (aio_req grp, SV *callback=&PL_sv_undef) |
1344 | CODE: |
1355 | CODE: |
1345 | { |
1356 | { |
1346 | SvREFCNT_dec (grp->fh2); |
1357 | SvREFCNT_dec (grp->fh2); |
1347 | grp->fh2 = newSVsv (callback); |
1358 | grp->fh2 = newSVsv (callback); |
1348 | |
1359 | |