--- IO-AIO/AIO.xs 2006/10/22 00:19:05 1.45 +++ IO-AIO/AIO.xs 2006/10/22 10:33:19 1.48 @@ -90,7 +90,6 @@ typedef aio_cb *aio_req; typedef aio_cb *aio_req_ornot; -typedef aio_cb *aio_group; static int started, wanted; static volatile int nreqs; @@ -149,6 +148,7 @@ ENTER; PUSHMARK (SP); + EXTEND (SP, 1); switch (req->type) { @@ -173,7 +173,7 @@ rv = sv_2mortal (newRV_noinc ((SV *)av)); } - XPUSHs (rv); + PUSHs (rv); } break; @@ -182,7 +182,7 @@ /* convert fd to fh */ SV *fh; - XPUSHs (sv_2mortal (newSViv (req->result))); + PUSHs (sv_2mortal (newSViv (req->result))); PUTBACK; call_pv ("IO::AIO::_fd2fh", G_SCALAR | G_EVAL); SPAGAIN; @@ -194,12 +194,23 @@ } break; - case REQ_SLEEP: case REQ_GROUP: + if (req->data) + { + int i; + AV *av = (AV *)req->data; + + EXTEND (SP, AvFILL (av) + 1); + for (i = 0; i <= AvFILL (av); ++i) + PUSHs (*av_fetch (av, i, 0)); + } + break; + + case REQ_SLEEP: break; default: - XPUSHs (sv_2mortal (newSViv (req->result))); + PUSHs (sv_2mortal (newSViv (req->result))); break; } @@ -229,7 +240,7 @@ req->grp_next->grp_prev = req->grp_prev; req->grp_prev->grp_next = req->grp_next; - if (grp->grp_next == grp) + if (grp->grp_next == grp && grp->fd) { req_invoke (grp); req_free (grp); @@ -313,7 +324,10 @@ if (req->type == REQ_QUIT) started--; else if (req->type == REQ_GROUP && req->grp_next != req) - continue; + { + req->fd = 1; /* mark request as delayed */ + continue; + } else { if (req->type == REQ_READ) @@ -1144,7 +1158,7 @@ void aio_group (callback=&PL_sv_undef) SV * callback - PROTOTYPE: ;& + PROTOTYPE: ;$ PPCODE: { dREQ; @@ -1207,6 +1221,8 @@ OUTPUT: RETVAL +PROTOTYPES: DISABLE + MODULE = IO::AIO PACKAGE = IO::AIO::REQ void @@ -1219,24 +1235,42 @@ void add (aio_req grp, ...) - PROTOTYPE: $;@ PPCODE: { int i; for (i = 1; i < items; ++i ) { - aio_req req = SvAIO_REQ (ST (i)); + if (GIMME_V != G_VOID) + XPUSHs (sv_2mortal (newSVsv (ST (i)))); - req->grp_prev = grp; - req->grp_next = grp->grp_next; - grp->grp_next->grp_prev = req; - grp->grp_next = req; + aio_req req = SvAIO_REQ (ST (i)); - req->grp = grp; + if (req) + { + req->grp_prev = grp; + req->grp_next = grp->grp_next; + grp->grp_next->grp_prev = req; + grp->grp_next = req; - if (GIMME_V != G_VOID) - XPUSHs (sv_2mortal (newSVsv (ST (i)))); + req->grp = grp; + } } } +void +result (aio_req grp, ...) + CODE: +{ + int i; + AV *av = newAV (); + + if (grp->data) + SvREFCNT_dec (grp->data); + + for (i = 1; i < items; ++i ) + av_push (av, newSVsv (ST (i))); + + grp->data = (SV *)av; +} +