--- IO-AIO/AIO.xs 2005/08/16 22:22:18 1.22 +++ IO-AIO/AIO.xs 2005/08/17 03:16:56 1.25 @@ -33,7 +33,7 @@ REQ_READ, REQ_WRITE, REQ_READAHEAD, REQ_STAT, REQ_LSTAT, REQ_FSTAT, REQ_FSYNC, REQ_FDATASYNC, - REQ_UNLINK, REQ_RMDIR, REQ_SYMLINK, + REQ_UNLINK, REQ_RMDIR, REQ_SYMLINK, }; @@ -88,6 +88,7 @@ { dSP; int count = 0; + int do_croak = 0; aio_req req, prv; pthread_mutex_lock (&reslock); @@ -160,6 +161,8 @@ SPAGAIN; } + do_croak = SvTRUE (ERRSV); + LEAVE; if (req->callback) @@ -173,7 +176,8 @@ req = req->next; Safefree (prv); - /* TODO: croak on errors? */ + if (do_croak) + croak (0); } return count; @@ -265,9 +269,7 @@ static void atfork_prepare (void) { - pthread_mutex_lock (&frklock); - - fork_started = started; + int nstarted; for (;;) { while (nreqs) @@ -276,6 +278,7 @@ poll_cb (); } + nstarted = started; max_parallel (0); pthread_mutex_lock (&reqlock); @@ -288,6 +291,8 @@ min_parallel (fork_started); } + pthread_mutex_lock (&frklock); + fork_started = nstarted; pthread_mutex_lock (&reslock); assert (!started); @@ -299,18 +304,14 @@ static void atfork_parent (void) { pthread_mutex_unlock (&reslock); - min_parallel (fork_started); - pthread_mutex_unlock (&reqlock); pthread_mutex_unlock (&frklock); -} - -static void atfork_child (void) -{ - reqs = reqe = 0; + pthread_mutex_unlock (&reqlock); - atfork_parent (); + min_parallel (fork_started); } +#define atfork_child atfork_parent + /*****************************************************************************/ /* work around various missing functions */