… | |
… | |
330 | FLAG_SV2_RO_OFF = 0x40, /* data was set readonly */ |
330 | FLAG_SV2_RO_OFF = 0x40, /* data was set readonly */ |
331 | }; |
331 | }; |
332 | |
332 | |
333 | typedef eio_req *aio_req; |
333 | typedef eio_req *aio_req; |
334 | typedef eio_req *aio_req_ornot; |
334 | typedef eio_req *aio_req_ornot; |
335 | typedef eio_wd *aio_wd; |
335 | typedef eio_wd aio_wd; |
336 | |
336 | |
337 | static SV *on_next_submit; |
337 | static SV *on_next_submit; |
338 | static int next_pri = EIO_PRI_DEFAULT; |
338 | static int next_pri = EIO_PRI_DEFAULT; |
339 | static int max_outstanding; |
339 | static int max_outstanding; |
340 | |
340 | |
… | |
… | |
363 | req->self = (SV *)newHV (); |
363 | req->self = (SV *)newHV (); |
364 | sv_magic (req->self, 0, PERL_MAGIC_ext, (char *)req, 0); |
364 | sv_magic (req->self, 0, PERL_MAGIC_ext, (char *)req, 0); |
365 | } |
365 | } |
366 | |
366 | |
367 | return sv_2mortal (sv_bless (newRV_inc (req->self), stash)); |
367 | return sv_2mortal (sv_bless (newRV_inc (req->self), stash)); |
|
|
368 | } |
|
|
369 | |
|
|
370 | static SV * |
|
|
371 | newSVaio_wd (aio_wd wd) |
|
|
372 | { |
|
|
373 | return sv_bless (newRV_noinc (newSViv ((long)wd)), aio_wd_stash); |
368 | } |
374 | } |
369 | |
375 | |
370 | static aio_req SvAIO_REQ (SV *sv) |
376 | static aio_req SvAIO_REQ (SV *sv) |
371 | { |
377 | { |
372 | MAGIC *mg; |
378 | MAGIC *mg; |
… | |
… | |
457 | } |
463 | } |
458 | |
464 | |
459 | switch (req->type) |
465 | switch (req->type) |
460 | { |
466 | { |
461 | case EIO_WD_OPEN: |
467 | case EIO_WD_OPEN: |
462 | PUSHs (sv_2mortal (sv_bless (newRV_noinc (newSViv (((long)req->wd))), aio_wd_stash))); |
468 | PUSHs (sv_2mortal (newSVaio_wd (req->wd))); |
463 | break; |
469 | break; |
464 | |
470 | |
465 | case EIO_READDIR: |
471 | case EIO_READDIR: |
466 | { |
472 | { |
467 | SV *rv = &PL_sv_undef; |
473 | SV *rv = &PL_sv_undef; |
… | |
… | |
611 | break; |
617 | break; |
612 | |
618 | |
613 | case EIO_STAT: |
619 | case EIO_STAT: |
614 | case EIO_LSTAT: |
620 | case EIO_LSTAT: |
615 | case EIO_FSTAT: |
621 | case EIO_FSTAT: |
616 | PL_laststype = req->type == EIO_LSTAT ? OP_LSTAT : OP_STAT; |
622 | PL_laststype = req->type == EIO_LSTAT ? OP_LSTAT : OP_STAT; |
|
|
623 | |
617 | PL_laststatval = req->result; |
624 | if (!(PL_laststatval = req->result)) |
618 | /* if compilation fails here then perl's Stat_t is not struct _stati64 */ |
625 | /* if compilation fails here then perl's Stat_t is not struct _stati64 */ |
619 | PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); |
626 | PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); |
|
|
627 | |
620 | PUSHs (sv_result); |
628 | PUSHs (sv_result); |
621 | break; |
629 | break; |
622 | |
630 | |
623 | case EIO_READ: |
631 | case EIO_READ: |
624 | { |
632 | { |
… | |
… | |
812 | XPUSHs (req_sv (req, aio_req_stash)); |
820 | XPUSHs (req_sv (req, aio_req_stash)); |
813 | |
821 | |
814 | static void |
822 | static void |
815 | req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr) |
823 | req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr) |
816 | { |
824 | { |
817 | if (SvROK (path)) |
825 | if (expect_false (SvROK (path))) |
818 | { |
826 | { |
819 | AV *av = (AV *)SvRV (path); |
827 | AV *av = (AV *)SvRV (path); |
820 | SV *wdob; |
828 | SV *wdob; |
821 | |
829 | |
822 | if (SvTYPE (av) != SVt_PVAV || AvFILLp (av) != 1) |
830 | if (SvTYPE (av) != SVt_PVAV || AvFILLp (av) != 1) |
823 | croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs"); |
831 | croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs"); |
824 | |
832 | |
825 | path = AvARRAY (av)[1]; |
833 | path = AvARRAY (av)[1]; |
826 | wdob = AvARRAY (av)[0]; |
834 | wdob = AvARRAY (av)[0]; |
827 | |
835 | |
|
|
836 | if (SvOK (wdob)) |
|
|
837 | { |
828 | *wd = SvAIO_WD (wdob); |
838 | *wd = SvAIO_WD (wdob); |
829 | *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); |
839 | *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); |
|
|
840 | } |
|
|
841 | else |
|
|
842 | *wd = EIO_INVALID_WD; |
830 | } |
843 | } |
831 | |
844 | |
832 | *pathsv = newSVsv (path); |
845 | *pathsv = newSVsv (path); |
833 | *ptr = SvPVbyte_nolen (*pathsv); |
846 | *ptr = SvPVbyte_nolen (*pathsv); |
834 | } |
847 | } |
… | |
… | |
1348 | PPCODE: |
1361 | PPCODE: |
1349 | { |
1362 | { |
1350 | dREQ; |
1363 | dREQ; |
1351 | |
1364 | |
1352 | req->type = EIO_READDIR; |
1365 | req->type = EIO_READDIR; |
1353 | req->sv1 = newSVsv (pathname); |
|
|
1354 | req->ptr1 = SvPVbyte_nolen (req->sv1); |
|
|
1355 | req->int1 = flags | EIO_READDIR_DENTS | EIO_READDIR_CUSTOM1; |
1366 | req->int1 = flags | EIO_READDIR_DENTS | EIO_READDIR_CUSTOM1; |
1356 | |
1367 | |
1357 | if (flags & EIO_READDIR_DENTS) |
1368 | if (flags & EIO_READDIR_DENTS) |
1358 | req->int1 |= EIO_READDIR_CUSTOM2; |
1369 | req->int1 |= EIO_READDIR_CUSTOM2; |
|
|
1370 | |
|
|
1371 | req_set_path1 (req, pathname); |
1359 | |
1372 | |
1360 | REQ_SEND; |
1373 | REQ_SEND; |
1361 | } |
1374 | } |
1362 | |
1375 | |
1363 | void |
1376 | void |
… | |
… | |
1736 | |
1749 | |
1737 | PROTOTYPES: DISABLE |
1750 | PROTOTYPES: DISABLE |
1738 | |
1751 | |
1739 | MODULE = IO::AIO PACKAGE = IO::AIO::WD |
1752 | MODULE = IO::AIO PACKAGE = IO::AIO::WD |
1740 | |
1753 | |
|
|
1754 | BOOT: |
|
|
1755 | { |
|
|
1756 | newCONSTSUB (aio_stash, "CWD" , newSVaio_wd (EIO_CWD )); |
|
|
1757 | newCONSTSUB (aio_stash, "INVALID_WD", newSVaio_wd (EIO_INVALID_WD)); |
|
|
1758 | } |
|
|
1759 | |
1741 | void |
1760 | void |
1742 | DESTROY (SV *self) |
1761 | DESTROY (SV *self) |
1743 | CODE: |
1762 | CODE: |
1744 | { |
1763 | { |
1745 | aio_wd wd = SvAIO_WD (self); |
1764 | aio_wd wd = SvAIO_WD (self); |