… | |
… | |
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; |
… | |
… | |
823 | croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs"); |
829 | croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs"); |
824 | |
830 | |
825 | path = AvARRAY (av)[1]; |
831 | path = AvARRAY (av)[1]; |
826 | wdob = AvARRAY (av)[0]; |
832 | wdob = AvARRAY (av)[0]; |
827 | |
833 | |
|
|
834 | if (SvOK (wdob)) |
|
|
835 | { |
828 | *wd = SvAIO_WD (wdob); |
836 | *wd = SvAIO_WD (wdob); |
829 | *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); |
837 | *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); |
|
|
838 | } |
|
|
839 | else |
|
|
840 | *wd = EIO_INVALID_WD; |
830 | } |
841 | } |
831 | |
842 | |
832 | *pathsv = newSVsv (path); |
843 | *pathsv = newSVsv (path); |
833 | *ptr = SvPVbyte_nolen (*pathsv); |
844 | *ptr = SvPVbyte_nolen (*pathsv); |
834 | } |
845 | } |
… | |
… | |
1736 | |
1747 | |
1737 | PROTOTYPES: DISABLE |
1748 | PROTOTYPES: DISABLE |
1738 | |
1749 | |
1739 | MODULE = IO::AIO PACKAGE = IO::AIO::WD |
1750 | MODULE = IO::AIO PACKAGE = IO::AIO::WD |
1740 | |
1751 | |
|
|
1752 | BOOT: |
|
|
1753 | { |
|
|
1754 | newCONSTSUB (aio_stash, "CWD" , newSVaio_wd (EIO_CWD )); |
|
|
1755 | newCONSTSUB (aio_stash, "INVALID_WD", newSVaio_wd (EIO_INVALID_WD)); |
|
|
1756 | } |
|
|
1757 | |
1741 | void |
1758 | void |
1742 | DESTROY (SV *self) |
1759 | DESTROY (SV *self) |
1743 | CODE: |
1760 | CODE: |
1744 | { |
1761 | { |
1745 | aio_wd wd = SvAIO_WD (self); |
1762 | aio_wd wd = SvAIO_WD (self); |