--- IO-AIO/AIO.xs 2007/09/24 18:14:00 1.106 +++ IO-AIO/AIO.xs 2007/10/06 14:05:19 1.109 @@ -99,6 +99,8 @@ # define SvVAL64 SvNV #endif +static HV *stash; + #define dBUF \ char *aio_buf; \ X_LOCK (wrklock); \ @@ -503,16 +505,31 @@ case REQ_OPEN: { /* convert fd to fh */ - SV *fh; + SV *fh = &PL_sv_undef; + + if (req->result >= 0) + { + GV *gv = (GV *)sv_newmortal (); + int flags = req->int1 & (O_RDONLY | O_WRONLY | O_RDWR); + char sym [64]; + int symlen; + + symlen = snprintf (sym, sizeof (sym), "fd#%d", req->result); + gv_init (gv, stash, sym, symlen, 0); + + symlen = snprintf ( + sym, + sizeof (sym), + "%s&=%d", + flags == O_RDONLY ? "<" : flags == O_WRONLY ? ">" : "+<", + req->result + ); + + if (do_open (gv, sym, symlen, 0, 0, 0, 0)) + fh = (SV *)gv; + } - PUSHs (sv_2mortal (newSViv (req->result))); - PUTBACK; - call_pv ("IO::AIO::_fd2fh", G_SCALAR | G_EVAL); - SPAGAIN; - - fh = POPs; - PUSHMARK (SP); - XPUSHs (fh); + PUSHs (fh); } break; @@ -566,11 +583,13 @@ errno = req->errorno; PUTBACK; - call_sv (req->callback, G_VOID | G_EVAL); + call_sv (req->callback, G_VOID | G_EVAL | G_DISCARD); SPAGAIN; FREETMPS; LEAVE; + + PUTBACK; } if (req->grp) @@ -1423,7 +1442,7 @@ BOOT: { - HV *stash = gv_stashpv ("IO::AIO", 1); + stash = gv_stashpv ("IO::AIO", 1); newCONSTSUB (stash, "EXDEV", newSViv (EXDEV)); newCONSTSUB (stash, "O_RDONLY", newSViv (O_RDONLY)); @@ -1501,10 +1520,9 @@ } void -aio_close (SV *fh, SV *callback=&PL_sv_undef) +aio_fsync (SV *fh, SV *callback=&PL_sv_undef) PROTOTYPE: $;$ ALIAS: - aio_close = REQ_CLOSE aio_fsync = REQ_FSYNC aio_fdatasync = REQ_FDATASYNC PPCODE: @@ -1517,6 +1535,27 @@ REQ_SEND (req); } + +int +_dup (int fd) + PROTOTYPE: $ + CODE: + RETVAL = dup (fd); + OUTPUT: + RETVAL + +void +_aio_close (int fd, SV *callback=&PL_sv_undef) + PROTOTYPE: $;$ + PPCODE: +{ + dREQ; + + req->type = REQ_CLOSE; + req->int1 = fd; + + REQ_SEND (req); +} void aio_read (SV *fh, SV *offset, SV *length, SV8 *data, IV dataoffset, SV *callback=&PL_sv_undef)