diff options
author | Mark H Weaver <mhw@netris.org> | 2013-02-28 17:56:58 -0500 |
---|---|---|
committer | Mark H Weaver <mhw@netris.org> | 2013-03-05 16:04:55 -0500 |
commit | f57ea23ac8e1436f37ceeda3ea8625243c20e645 (patch) | |
tree | 9770b54992f625abae89964d8b6efea62d09dea6 /libguile/debug.c | |
parent | 29ace173b170a5d77e6becb30fb1d9f253a373d5 (diff) | |
download | guile-f57ea23ac8e1436f37ceeda3ea8625243c20e645.tar.gz |
Fix thread-unsafe lazy initializations.
* libguile/debug.c (scm_local_eval):
libguile/ports.c (scm_current_warning_port):
libguile/strports.c (scm_eval_string_in_module): Perform
lazy-initialization while holding a mutex. Use SCM_UNDEFINED as the
uninitialized value. Use 'scm_c_*_variable'.
* doc/ref/api-modules.texi (Accessing Modules from C): Fix
'my_eval_string' example to be thread-safe.
Diffstat (limited to 'libguile/debug.c')
-rw-r--r-- | libguile/debug.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libguile/debug.c b/libguile/debug.c index b1a90d84d..9e6328b3a 100644 --- a/libguile/debug.c +++ b/libguile/debug.c @@ -211,10 +211,14 @@ SCM_DEFINE (scm_debug_hang, "debug-hang", 0, 1, 0, SCM scm_local_eval (SCM exp, SCM env) { - static SCM local_eval_var = SCM_BOOL_F; + static SCM local_eval_var = SCM_UNDEFINED; + static scm_i_pthread_mutex_t local_eval_var_mutex + = SCM_I_PTHREAD_MUTEX_INITIALIZER; - if (scm_is_false (local_eval_var)) + scm_i_scm_pthread_mutex_lock (&local_eval_var_mutex); + if (SCM_UNBNDP (local_eval_var)) local_eval_var = scm_c_public_variable ("ice-9 local-eval", "local-eval"); + scm_i_pthread_mutex_unlock (&local_eval_var_mutex); return scm_call_2 (SCM_VARIABLE_REF (local_eval_var), exp, env); } |