--- IO-AIO/AIO.xs 2006/10/22 22:14:33 1.51 +++ 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; @@ -820,6 +823,8 @@ req->result = select (0, 0, 0, 0, &tv); } + case REQ_GROUP: + case REQ_NOP: case REQ_QUIT: break; @@ -834,7 +839,6 @@ req->next = 0; - printf ("queue rese %p\n", rese);//D if (rese) { rese->next = req; @@ -1213,6 +1217,18 @@ } void +aio_nop (callback=&PL_sv_undef) + SV * callback + PPCODE: +{ + dREQ; + + req->type = REQ_NOP; + + REQ_SEND; +} + +void flush () PROTOTYPE: CODE: @@ -1273,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 @@ -1280,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"); @@ -1289,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) { @@ -1322,23 +1345,13 @@ } void -lock (aio_req grp) - CODE: - ++grp->length; - -void -unlock (aio_req grp) - CODE: - aio_grp_dec (grp); - -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);