--- IO-AIO/AIO.xs 2005/08/17 04:47:02 1.27 +++ IO-AIO/AIO.xs 2005/08/17 05:06:59 1.28 @@ -144,6 +144,9 @@ if (req->type == REQ_READ) SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0)); + if (req->data2ptr && (req->type == REQ_READ || req->type == REQ_WRITE)) + SvREADONLY_off (req->data); + if (req->statdata) { PL_laststype = req->type == REQ_LSTAT ? OP_LSTAT : OP_STAT; @@ -296,29 +299,8 @@ static void atfork_prepare (void) { - for (;;) { - - for (;;) - { - poll_cb (); - - if (!nreqs) - break; - - poll_wait (); - } - - pthread_mutex_lock (&reqlock); - - if (!nreqs) - break; - - pthread_mutex_unlock (&reqlock); - } - + pthread_mutex_lock (&reqlock); pthread_mutex_lock (&reslock); - - assert (!nreqs && !reqs && !ress); } static void atfork_parent (void) @@ -329,9 +311,29 @@ static void atfork_child (void) { + aio_req prv; + int restart = started; started = 0; + while (reqs) + { + prv = reqs; + reqs = prv->next; + free_req (prv); + } + + reqs = reqe = 0; + + while (ress) + { + prv = ress; + ress = prv->next; + free_req (prv); + } + + ress = rese = 0; + atfork_parent (); min_parallel (restart); @@ -631,6 +633,12 @@ req->data = SvREFCNT_inc (data); req->dataptr = (char *)svptr + dataoffset; + if (!SvREADONLY (data)) + { + SvREADONLY_on (data); + req->data2ptr = (void *)data; + } + send_req (req); } }