--- IO-AIO/AIO.xs 2008/05/10 19:25:33 1.116 +++ IO-AIO/AIO.xs 2008/05/10 20:02:09 1.117 @@ -103,9 +103,9 @@ typedef eio_req *aio_req; typedef eio_req *aio_req_ornot; -static int max_outstanding = 0; - +static SV *on_next_submit; static int next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS; +static int max_outstanding; static int respipe_osf [2], respipe [2] = { -1, -1 }; @@ -168,6 +168,23 @@ } } +static void req_submit (eio_req *req) +{ + eio_submit (req); + + if (on_next_submit) + { + dSP; + SV *cb = sv_2mortal (on_next_submit); + + on_next_submit = 0; + + PUSHMARK (SP); + PUTBACK; + call_sv (cb, G_DISCARD | G_EVAL); + } +} + static int req_invoke (eio_req *req) { dSP; @@ -442,7 +459,7 @@ req->pri = req_pri #define REQ_SEND \ - eio_submit (req); \ + req_submit (req); \ \ if (GIMME_V != G_VOID) \ XPUSHs (req_sv (req, AIO_REQ_KLASS)); @@ -1005,6 +1022,11 @@ OUTPUT: RETVAL +void _on_next_submit (SV *cb) + CODE: + SvREFCNT_dec (on_next_submit); + on_next_submit = SvOK (cb) ? newSVsv (cb) : 0; + PROTOTYPES: DISABLE MODULE = IO::AIO PACKAGE = IO::AIO::REQ