diff options
author | Ludovic Courtès <ludo@gnu.org> | 2013-05-30 23:30:27 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2013-05-30 23:30:54 +0200 |
commit | 1701a68920cf1b83d320711a4d47806ba089c148 (patch) | |
tree | 7781f6b2763ebbdc41020e3c8316a4b8594aca45 /libguile | |
parent | b782ed0137e93f3bcfcffdbfe2785e6425ef9e32 (diff) | |
download | guile-1701a68920cf1b83d320711a4d47806ba089c148.tar.gz |
Do not assume `pthread_t' is an integer type.
Fixes <http://bugs.gnu.org/14469>.
Reported by Panicz Maciej Godek <godek.maciek@gmail.com>.
* libguile/finalizers.c (finalization_thread_is_running): New variable.
(start_finalization_thread): Use it to determine whether
FINALIZATION_THREAD is up and running.
(stop_finalization_thread): Likewise.
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/finalizers.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/libguile/finalizers.c b/libguile/finalizers.c index 7fadd2248..db4e4c4d9 100644 --- a/libguile/finalizers.c +++ b/libguile/finalizers.c @@ -185,6 +185,7 @@ static int finalization_pipe[2]; static scm_i_pthread_mutex_t finalization_thread_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; static pthread_t finalization_thread; +static int finalization_thread_is_running = 0; static void notify_finalizers_to_run (void) @@ -256,14 +257,18 @@ static void start_finalization_thread (void) { scm_i_pthread_mutex_lock (&finalization_thread_lock); - if (!finalization_thread) - /* Use the raw pthread API and scm_with_guile, because we don't want - to block on any lock that scm_spawn_thread might want to take, - and we don't want to inherit the dynamic state (fluids) of the - caller. */ - if (pthread_create (&finalization_thread, NULL, - run_finalization_thread, NULL)) - perror ("error creating finalization thread"); + if (!finalization_thread_is_running) + { + /* Use the raw pthread API and scm_with_guile, because we don't want + to block on any lock that scm_spawn_thread might want to take, + and we don't want to inherit the dynamic state (fluids) of the + caller. */ + if (pthread_create (&finalization_thread, NULL, + run_finalization_thread, NULL)) + perror ("error creating finalization thread"); + else + finalization_thread_is_running = 1; + } scm_i_pthread_mutex_unlock (&finalization_thread_lock); } @@ -271,12 +276,12 @@ static void stop_finalization_thread (void) { scm_i_pthread_mutex_lock (&finalization_thread_lock); - if (finalization_thread) + if (finalization_thread_is_running) { notify_about_to_fork (); if (pthread_join (finalization_thread, NULL)) perror ("joining finalization thread"); - finalization_thread = 0; + finalization_thread_is_running = 0; } scm_i_pthread_mutex_unlock (&finalization_thread_lock); } |