--- IO-AIO/AIO.xs 2006/10/21 23:06:04 1.43 +++ IO-AIO/AIO.xs 2006/10/21 23:20:29 1.44 @@ -55,14 +55,15 @@ REQ_UNLINK, REQ_RMDIR, REQ_RENAME, REQ_READDIR, REQ_LINK, REQ_SYMLINK, + REQ_GROUP, }; -#define AIO_CB_KLASS "IO::AIO::CB" +#define AIO_REQ_KLASS "IO::AIO::REQ" +#define AIO_GRP_KLASS "IO::AIO::GRP" typedef struct aio_cb { - struct aio_cb *grp_prev, *grp_next; - struct aio_grp *grp; + struct aio_cb *grp, *grp_prev, *grp_next; struct aio_cb *volatile next; @@ -86,6 +87,7 @@ typedef aio_cb *aio_req; typedef aio_cb *aio_req_ornot; +typedef aio_cb *aio_group; static int started, wanted; static volatile int nreqs; @@ -99,52 +101,19 @@ static volatile aio_req reqs, reqe; /* queue start, queue end */ static volatile aio_req ress, rese; /* queue start, queue end */ -typedef struct aio_grp -{ - struct aio_cb *first, *last; - SV *callback; - int busycount; -} aio_grp; - -static void aio_grp_begin (aio_grp *grp) -{ - ++grp->busycount; -} - -static void aio_grp_end (aio_grp *grp) -{ - --grp->busycount; - - if (grp->busycount) - return; - - SvREFCNT_dec (grp->callback); - grp->callback = 0; -} - -static aio_grp *aio_grp_new () -{ - aio_grp *grp; - - Newz (0, grp, 1, aio_grp); - aio_grp_begin (grp); - - return grp; -} - /* must be called at most once */ -static SV *req_sv (aio_req req) +static SV *req_sv (aio_req req, const char *klass) { req->self = (SV *)newHV (); sv_magic (req->self, 0, PERL_MAGIC_ext, (char *)req, 0); - return sv_bless (newRV_noinc (req->self), gv_stashpv (AIO_CB_KLASS, 1)); + return sv_2mortal (sv_bless (newRV_noinc (req->self), gv_stashpv (klass, 1))); } -static aio_req SvAIO_REQ (SV *sv) +static aio_req SvAIO_REQ (SV *sv, const char *klass) { - if (!sv_derived_from (sv, AIO_CB_KLASS) || !SvROK (sv)) - croak ("object of class " AIO_CB_KLASS " expected"); + if (!sv_derived_from (sv, klass) || !SvROK (sv)) + croak ("object of class %s expected", klass); MAGIC *mg = mg_find (SvRV (sv), PERL_MAGIC_ext); @@ -848,7 +817,7 @@ req_send (req); \ \ if (GIMME_V != G_VOID) \ - XPUSHs (req_sv (req)); + XPUSHs (req_sv (req, AIO_REQ_KLASS)); MODULE = IO::AIO PACKAGE = IO::AIO @@ -1105,29 +1074,17 @@ REQ_SEND; } -#if 0 - -# undocumented, because it does not cancel active requests void -cancel_most_requests () - PROTOTYPE: - CODE: +aio_group (callback=&PL_sv_undef) + SV * callback + PROTOTYPE: ;& + PPCODE: { - aio_req *req; - - pthread_mutex_lock (&reqlock); - for (req = reqs; req; req = req->next) - req->flags |= 1; - pthread_mutex_unlock (&reqlock); - - pthread_mutex_lock (&reslock); - for (req = ress; req; req = req->next) - req->flags |= 1; - pthread_mutex_unlock (&reslock); + dREQ; + req->type = REQ_GROUP; + XPUSHs (req_sv (req, AIO_GRP_KLASS)); } -#endif - void flush () PROTOTYPE: @@ -1179,7 +1136,7 @@ OUTPUT: RETVAL -MODULE = IO::AIO PACKAGE = IO::AIO::CB +MODULE = IO::AIO PACKAGE = IO::AIO::REQ void cancel (aio_req_ornot req)