diff options
author | Andy Wingo <wingo@igalia.com> | 2013-03-13 11:01:38 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-03-13 11:01:38 +0100 |
commit | dbab8aaacaa7ce4d1d3db09d422615b6fcd6724f (patch) | |
tree | e2f8b5c3f1d0f3f24fd5b7cf7fb2955a092549bc /libguile/threads.c | |
parent | dfd1d3b144d97522b2a4e82dc583a43e0b4f8b93 (diff) | |
download | guile-dbab8aaacaa7ce4d1d3db09d422615b6fcd6724f.tar.gz |
allow for spurious wakeups from pthread_cond_wait
* libguile/threads.c (scm_call_with_new_thread, scm_spawn_thread): Allow
for spurious wakeups while waiting on cond variables. Should fix bug
10641.
Diffstat (limited to 'libguile/threads.c')
-rw-r--r-- | libguile/threads.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libguile/threads.c b/libguile/threads.c index c1b9c3982..04897e383 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -1,5 +1,5 @@ /* Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, - * 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 + * 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 * Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -1058,7 +1058,10 @@ SCM_DEFINE (scm_call_with_new_thread, "call-with-new-thread", 1, 1, 0, errno = err; scm_syserror (NULL); } - scm_i_scm_pthread_cond_wait (&data.cond, &data.mutex); + + while (scm_is_false (data.thread)) + scm_i_scm_pthread_cond_wait (&data.cond, &data.mutex); + scm_i_pthread_mutex_unlock (&data.mutex); return data.thread; @@ -1135,7 +1138,10 @@ scm_spawn_thread (scm_t_catch_body body, void *body_data, errno = err; scm_syserror (NULL); } - scm_i_scm_pthread_cond_wait (&data.cond, &data.mutex); + + while (scm_is_false (data.thread)) + scm_i_scm_pthread_cond_wait (&data.cond, &data.mutex); + scm_i_pthread_mutex_unlock (&data.mutex); assert (SCM_I_IS_THREAD (data.thread)); |