--- IO-AIO/AIO.xs 2006/10/22 21:13:47 1.50 +++ IO-AIO/AIO.xs 2006/10/23 18:38:15 1.57 @@ -57,8 +57,8 @@ REQ_UNLINK, REQ_RMDIR, REQ_RENAME, REQ_READDIR, REQ_LINK, REQ_SYMLINK, + REQ_GROUP, REQ_NOP, REQ_SLEEP, - REQ_GROUP, }; #define AIO_REQ_KLASS "IO::AIO::REQ" @@ -120,17 +120,19 @@ static aio_req SvAIO_REQ (SV *sv) { + MAGIC *mg; + if (!sv_derived_from (sv, AIO_REQ_KLASS) || !SvROK (sv)) croak ("object of class " AIO_REQ_KLASS " expected"); - MAGIC *mg = mg_find (SvRV (sv), PERL_MAGIC_ext); + mg = mg_find (SvRV (sv), PERL_MAGIC_ext); return mg ? (aio_req)mg->mg_ptr : 0; } static void aio_grp_feed (aio_req grp) { - while (grp->length < grp->fd2) + while (grp->length < grp->fd2 && !grp->cancelled) { int old_len = grp->length; @@ -259,6 +261,7 @@ } break; + case REQ_NOP: case REQ_SLEEP: break; @@ -272,16 +275,16 @@ call_sv (req->callback, G_VOID | G_EVAL); SPAGAIN; + FREETMPS; + LEAVE; + + errno = errorno; + if (SvTRUE (ERRSV)) { req_free (req); croak (0); } - - FREETMPS; - LEAVE; - - errno = errorno; } static void req_free (aio_req req) @@ -820,6 +823,8 @@ req->result = select (0, 0, 0, 0, &tv); } + case REQ_GROUP: + case REQ_NOP: case REQ_QUIT: break; @@ -1212,6 +1217,18 @@ } void +aio_nop (callback=&PL_sv_undef) + SV * callback + PPCODE: +{ + dREQ; + + req->type = REQ_NOP; + + REQ_SEND; +} + +void flush () PROTOTYPE: CODE: @@ -1272,6 +1289,12 @@ CODE: req_cancel (req); +void +cb (aio_req req, SV *callback=&PL_sv_undef) + CODE: + SvREFCNT_dec (req->callback); + req->callback = newSVsv (callback); + MODULE = IO::AIO PACKAGE = IO::AIO::GRP void @@ -1279,6 +1302,7 @@ PPCODE: { int i; + aio_req req; if (grp->fd == 2) croak ("cannot add requests to IO::AIO::GRP after the group finished"); @@ -1288,7 +1312,7 @@ if (GIMME_V != G_VOID) XPUSHs (sv_2mortal (newSVsv (ST (i)))); - aio_req req = SvAIO_REQ (ST (i)); + req = SvAIO_REQ (ST (i)); if (req) { @@ -1307,23 +1331,27 @@ } void -lock (aio_req grp) - CODE: - ++grp->length; +result (aio_req grp, ...) + CODE: +{ + int i; + AV *av = newAV (); -void -unlock (aio_req grp) - CODE: - aio_grp_dec (grp); + for (i = 1; i < items; ++i ) + av_push (av, newSVsv (ST (i))); + + SvREFCNT_dec (grp->data); + grp->data = (SV *)av; +} void -feeder_limit (aio_req grp, int limit) +feed_limit (aio_req grp, int limit) CODE: grp->fd2 = limit; aio_grp_feed (grp); void -set_feeder (aio_req grp, SV *callback=&PL_sv_undef) +feed (aio_req grp, SV *callback=&PL_sv_undef) CODE: { SvREFCNT_dec (grp->fh2);