mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-09 21:40:33 +02:00
* 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.
This commit is contained in:
parent
2d7cbf9e0b
commit
152812c057
2 changed files with 15 additions and 2 deletions
|
@ -1,3 +1,13 @@
|
|||
2001-10-06 Mikael Djurfeldt <mdj@linnaeus>
|
||||
|
||||
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 <D.Herrmann@tu-bs.de>
|
||||
|
||||
* options.c (protected_objects, scm_init_options): The content of
|
||||
|
|
|
@ -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.28 2001-10-06 16:30:20 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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue