--- IO-AIO/AIO.xs 2011/09/26 20:19:08 1.195 +++ IO-AIO/AIO.xs 2011/09/29 09:57:12 1.201 @@ -332,7 +332,7 @@ typedef eio_req *aio_req; typedef eio_req *aio_req_ornot; -typedef eio_wd *aio_wd; +typedef eio_wd aio_wd; static SV *on_next_submit; static int next_pri = EIO_PRI_DEFAULT; @@ -343,20 +343,23 @@ static void req_destroy (aio_req req); static void req_cancel (aio_req req); -static void want_poll (void) +static void +want_poll (void) { /* write a dummy byte to the pipe so fh becomes ready */ s_epipe_signal (&respipe); } -static void done_poll (void) +static void +done_poll (void) { /* read any signals sent by the worker threads */ s_epipe_drain (&respipe); } /* must be called at most once */ -static SV *req_sv (aio_req req, HV *stash) +static SV * +req_sv (aio_req req, HV *stash) { if (!req->self) { @@ -367,7 +370,14 @@ return sv_2mortal (sv_bless (newRV_inc (req->self), stash)); } -static aio_req SvAIO_REQ (SV *sv) +static SV * +newSVaio_wd (aio_wd wd) +{ + return sv_bless (newRV_noinc (newSViv ((long)wd)), aio_wd_stash); +} + +static aio_req +SvAIO_REQ (SV *sv) { MAGIC *mg; @@ -382,7 +392,8 @@ return mg ? (aio_req)mg->mg_ptr : 0; } -static aio_wd SvAIO_WD (SV *sv) +static aio_wd +SvAIO_WD (SV *sv) { if (!SvROK (sv) || SvSTASH (SvRV (sv)) != aio_wd_stash @@ -392,7 +403,8 @@ return (aio_wd)(long)SvIVX (SvRV (sv)); } -static void aio_grp_feed (aio_req grp) +static void +aio_grp_feed (aio_req grp) { if (grp->sv2 && SvOK (grp->sv2)) { @@ -410,7 +422,8 @@ } } -static void req_submit (eio_req *req) +static void +req_submit (eio_req *req) { eio_submit (req); @@ -427,7 +440,8 @@ } } -static int req_invoke (eio_req *req) +static int +req_invoke (eio_req *req) { if (req->flags & FLAG_SV2_RO_OFF) SvREADONLY_off (req->sv2); @@ -459,7 +473,7 @@ switch (req->type) { case EIO_WD_OPEN: - PUSHs (sv_2mortal (sv_bless (newRV_noinc (newSViv (((long)req->wd))), aio_wd_stash))); + PUSHs (sv_2mortal (newSVaio_wd (req->wd))); break; case EIO_READDIR: @@ -613,10 +627,12 @@ case EIO_STAT: case EIO_LSTAT: case EIO_FSTAT: - PL_laststype = req->type == EIO_LSTAT ? OP_LSTAT : OP_STAT; - PL_laststatval = req->result; - /* if compilation fails here then perl's Stat_t is not struct _stati64 */ - PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); + PL_laststype = req->type == EIO_LSTAT ? OP_LSTAT : OP_STAT; + + if (!(PL_laststatval = req->result)) + /* if compilation fails here then perl's Stat_t is not struct _stati64 */ + PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); + PUSHs (sv_result); break; @@ -660,7 +676,8 @@ return !!SvTRUE (ERRSV); } -static void req_destroy (aio_req req) +static void +req_destroy (aio_req req) { if (req->self) { @@ -677,7 +694,8 @@ Safefree (req); } -static void req_cancel_subs (aio_req grp) +static void +req_cancel_subs (aio_req grp) { if (grp->type != EIO_GROUP) return; @@ -688,13 +706,15 @@ eio_grp_cancel (grp); } -static void create_respipe (void) +static void ecb_cold +create_respipe (void) { if (s_epipe_renew (&respipe)) croak ("IO::AIO: unable to initialize result pipe"); } -static void poll_wait (void) +static void +poll_wait (void) { while (eio_nreqs ()) { @@ -713,7 +733,8 @@ } } -static int poll_cb (void) +static int +poll_cb (void) { for (;;) { @@ -756,7 +777,8 @@ #define MMAP_MAGIC PERL_MAGIC_ext -static int mmap_free (pTHX_ SV *sv, MAGIC *mg) +static int ecb_cold +mmap_free (pTHX_ SV *sv, MAGIC *mg) { int old_errno = errno; munmap (mg->mg_ptr, (size_t)mg->mg_obj); @@ -782,7 +804,8 @@ /*****************************************************************************/ -static SV * get_cb (SV *cb_sv) +static SV * +get_cb (SV *cb_sv) { SvGETMAGIC (cb_sv); return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0; @@ -811,10 +834,10 @@ if (GIMME_V != G_VOID) \ XPUSHs (req_sv (req, aio_req_stash)); -static void +ecb_inline void req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr) { - if (SvROK (path)) + if (expect_false (SvROK (path))) { AV *av = (AV *)SvRV (path); SV *wdob; @@ -825,21 +848,26 @@ path = AvARRAY (av)[1]; wdob = AvARRAY (av)[0]; - *wd = SvAIO_WD (wdob); - *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); + if (SvOK (wdob)) + { + *wd = SvAIO_WD (wdob); + *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); + } + else + *wd = EIO_INVALID_WD; } *pathsv = newSVsv (path); *ptr = SvPVbyte_nolen (*pathsv); } -static void +static void ecb_noinline req_set_path1 (aio_req req, SV *path) { req_set_path (req, path, &req->sv1, &req->sv3, &req->wd, &req->ptr1); } -static void +static void ecb_noinline req_set_fh_or_path (aio_req req, int type_path, int type_fh, SV *fh_or_path) { SV *rv = SvROK (fh_or_path) ? SvRV (fh_or_path) : fh_or_path; @@ -859,7 +887,6 @@ req_set_path1 (req, fh_or_path); break; } - } MODULE = IO::AIO PACKAGE = IO::AIO @@ -1317,9 +1344,6 @@ void aio_chmod (SV8 *fh_or_path, int mode, SV *callback=&PL_sv_undef) - ALIAS: - aio_chmod = EIO_CHMOD - aio_mkdir = EIO_MKDIR PPCODE: { dREQ; @@ -1350,17 +1374,30 @@ dREQ; req->type = EIO_READDIR; - req->sv1 = newSVsv (pathname); - req->ptr1 = SvPVbyte_nolen (req->sv1); req->int1 = flags | EIO_READDIR_DENTS | EIO_READDIR_CUSTOM1; if (flags & EIO_READDIR_DENTS) req->int1 |= EIO_READDIR_CUSTOM2; + req_set_path1 (req, pathname); + REQ_SEND; } void +aio_mkdir (SV8 *pathname, int mode, SV *callback=&PL_sv_undef) + PPCODE: +{ + dREQ; + + req->type = EIO_MKDIR; + req->int2 = mode; + req_set_path1 (req, pathname); + + REQ_SEND; +} + +void aio_unlink (SV8 *pathname, SV *callback=&PL_sv_undef) ALIAS: aio_unlink = EIO_UNLINK @@ -1385,7 +1422,7 @@ PPCODE: { dREQ; - eio_wd wd2; + eio_wd wd2 = 0; req->type = ix; req_set_path1 (req, oldpath); @@ -1738,6 +1775,12 @@ MODULE = IO::AIO PACKAGE = IO::AIO::WD +BOOT: +{ + newCONSTSUB (aio_stash, "CWD" , newSVaio_wd (EIO_CWD )); + newCONSTSUB (aio_stash, "INVALID_WD", newSVaio_wd (EIO_INVALID_WD)); +} + void DESTROY (SV *self) CODE: