diff --git a/libguile/ChangeLog b/libguile/ChangeLog index 7e15864cb..bcca0ef01 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,13 @@ +2001-10-06 Mikael Djurfeldt + + These changes fixes a race condition in the Guile coop - pthread + compatibility code. + + * coop.c (mother_awake_p): New variable. + (coop_create): Set mother_awake_p before creating or signalling + mother; wait until mother is going to sleep before returning. + (mother): Reset mother_awake_p before going to sleep. + 2001-10-05 Dirk Herrmann * numbers.h: Removed old comment about using SCM_CAR to access diff --git a/libguile/coop.c b/libguile/coop.c index a6ef33ed2..c53a58017 100644 --- a/libguile/coop.c +++ b/libguile/coop.c @@ -40,7 +40,7 @@ * If you do not wish that, delete this exception notice. */ -/* $Id: coop.c,v 1.27 2001-03-10 03:09:07 mdj Exp $ */ +/* $Id: coop.c,v 1.27.4.1 2001-10-06 16:28:34 mdj Exp $ */ /* Cooperative thread library, based on QuickThreads */ @@ -171,6 +171,7 @@ static pthread_cond_t coop_cond_quit; static pthread_cond_t coop_cond_create; static pthread_mutex_t coop_mutex_create; static pthread_t coop_mother; +static int mother_awake_p = 0; static coop_t *coop_child; #endif @@ -584,6 +585,7 @@ mother (void *dummy) NULL, dummy_start, coop_child); + mother_awake_p = 0; do res = pthread_cond_wait (&coop_cond_create, &coop_mutex_create); while (res == EINTR); @@ -618,6 +620,7 @@ coop_create (coop_userf_t *f, void *pu) t->n_keys = 0; #ifdef GUILE_PTHREAD_COMPAT coop_child = t; + mother_awake_p = 1; if (coop_quitting_p < 0) { coop_quitting_p = 0; @@ -635,7 +638,7 @@ coop_create (coop_userf_t *f, void *pu) * condition variable because they are not safe against * pre-emptive switching. */ - while (coop_child) + while (coop_child || mother_awake_p) usleep (0); #else t->sto = malloc (COOP_STKSIZE);