--- IO-AIO/AIO.xs 2007/10/03 21:27:51 1.107 +++ IO-AIO/AIO.xs 2008/04/01 19:40:47 1.112 @@ -121,7 +121,7 @@ REQ_UTIME, REQ_FUTIME, REQ_CHMOD, REQ_FCHMOD, REQ_CHOWN, REQ_FCHOWN, - REQ_FSYNC, REQ_FDATASYNC, + REQ_SYNC, REQ_FSYNC, REQ_FDATASYNC, REQ_UNLINK, REQ_RMDIR, REQ_MKDIR, REQ_RENAME, REQ_MKNOD, REQ_READDIR, REQ_LINK, REQ_SYMLINK, REQ_READLINK, @@ -191,7 +191,7 @@ static int main_sig; static int block_sig_level; -void block_sig () +void block_sig (void) { sigset_t ss; @@ -206,7 +206,7 @@ pthread_sigmask (SIG_BLOCK, &ss, 0); } -void unblock_sig () +void unblock_sig (void) { sigset_t ss; @@ -276,7 +276,7 @@ #if WORDACCESS_UNSAFE -static unsigned int get_nready () +static unsigned int get_nready (void) { unsigned int retval; @@ -287,7 +287,7 @@ return retval; } -static unsigned int get_npending () +static unsigned int get_npending (void) { unsigned int retval; @@ -298,7 +298,7 @@ return retval; } -static unsigned int get_nthreads () +static unsigned int get_nthreads (void) { unsigned int retval; @@ -371,7 +371,7 @@ abort (); } -static int poll_cb (); +static int poll_cb (void); static int req_invoke (aio_req req); static void req_destroy (aio_req req); static void req_cancel (aio_req req); @@ -526,10 +526,10 @@ ); if (do_open (gv, sym, symlen, 0, 0, 0, 0)) - fh = gv; + fh = (SV *)gv; } - XPUSHs (fh); + PUSHs (fh); } break; @@ -583,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) @@ -653,7 +655,7 @@ #endif static void -create_respipe () +create_respipe (void) { int old_readfd = respipe [0]; @@ -715,7 +717,7 @@ X_UNLOCK (wrklock); } -static void maybe_start_thread () +static void maybe_start_thread (void) { if (get_nthreads () >= wanted) return; @@ -785,7 +787,7 @@ end_thread (); } -static void poll_wait () +static void poll_wait (void) { fd_set rfd; @@ -808,7 +810,7 @@ } } -static int poll_cb () +static int poll_cb (void) { dSP; int count = 0; @@ -1182,7 +1184,6 @@ X_THREAD_PROC (aio_proc) { - {//D aio_req req; struct timespec ts; worker *self = (worker *)thr_arg; @@ -1257,7 +1258,7 @@ case REQ_FTRUNCATE: req->result = ftruncate (req->int1, req->offs); break; case REQ_OPEN: req->result = open (req->ptr1, req->int1, req->mode); break; - case REQ_CLOSE: req->result = PerlIO_close ((PerlIO *)req->ptr1); break; + case REQ_CLOSE: req->result = close (req->int1); break; case REQ_UNLINK: req->result = unlink (req->ptr1); break; case REQ_RMDIR: req->result = rmdir (req->ptr1); break; case REQ_MKDIR: req->result = mkdir (req->ptr1, req->mode); break; @@ -1267,8 +1268,10 @@ case REQ_MKNOD: req->result = mknod (req->ptr2, req->mode, (dev_t)req->offs); break; case REQ_READLINK: req->result = readlink (req->ptr2, req->ptr1, NAME_MAX); break; - case REQ_FDATASYNC: req->result = fdatasync (req->int1); break; + case REQ_SYNC: req->result = 0; sync (); break; case REQ_FSYNC: req->result = fsync (req->int1); break; + case REQ_FDATASYNC: req->result = fdatasync (req->int1); break; + case REQ_READDIR: scandir_ (req, self); break; case REQ_BUSY: @@ -1350,7 +1353,6 @@ X_UNLOCK (wrklock); return 0; - }//D } /*****************************************************************************/ @@ -1534,28 +1536,25 @@ REQ_SEND (req); } +int +_dup (int fd) + PROTOTYPE: $ + CODE: + RETVAL = dup (fd); + OUTPUT: + RETVAL + void -aio_close (SV *fh, SV *callback=&PL_sv_undef) +_aio_close (int fd, SV *callback=&PL_sv_undef) PROTOTYPE: $;$ PPCODE: { - PerlIO *io = IoIFP (sv_2io (fh)); - int fd = PerlIO_fileno (io); - - if (fd < 0) - croak ("aio_close called with fd-less filehandle"); - - PerlIO_binmode (io, 0, 0, 0); - - { - dREQ; + dREQ; - req->type = REQ_CLOSE; - req->sv1 = newSVsv (fh); - req->ptr1 = (void *)io; + req->type = REQ_CLOSE; + req->int1 = fd; - REQ_SEND (req); - } + REQ_SEND (req); } void @@ -1890,11 +1889,14 @@ void aio_nop (SV *callback=&PL_sv_undef) + ALIAS: + aio_nop = REQ_NOP + aio_sync = REQ_SYNC PPCODE: { dREQ; - req->type = REQ_NOP; + req->type = ix; REQ_SEND; } @@ -1990,7 +1992,6 @@ PUSHMARK (SP); PUTBACK; count = call_sv (cb, GIMME_V | G_NOARGS | G_EVAL); - SPAGAIN; unblock_sig (); if (SvTRUE (ERRSV))