--- IO-AIO/AIO.xs 2006/10/22 00:19:05 1.45 +++ IO-AIO/AIO.xs 2006/10/22 00:49:29 1.46 @@ -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; @@ -229,7 +228,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 +312,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 +1146,7 @@ void aio_group (callback=&PL_sv_undef) SV * callback - PROTOTYPE: ;& + PROTOTYPE: ;$ PPCODE: { dREQ; @@ -1226,17 +1228,21 @@ 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)); + printf ("req = %p\n", req);//D - 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; + } } }