From 0b77014f0c7d53b8bdbc7059c92f526560e1cacd Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 16 Jun 2011 19:35:14 +0200 Subject: fix initial values of reallocated fluids * libguile/threads.h: * libguile/threads.c (scm_i_reset_fluid): New internal function, resets the binding of a fluid for all threads. Needed for fluid GC. * libguile/fluids.c (new_fluid): Call scm_i_reset_fluid here. --- libguile/threads.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'libguile/threads.c') diff --git a/libguile/threads.c b/libguile/threads.c index 64807f8c0..97d9f6497 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -484,6 +484,24 @@ static int thread_count; static SCM scm_i_default_dynamic_state; +/* Run when a fluid is collected. */ +void +scm_i_reset_fluid (size_t n, SCM val) +{ + scm_i_thread *t; + + scm_i_pthread_mutex_lock (&thread_admin_mutex); + for (t = all_threads; t; t = t->next_thread) + if (SCM_I_DYNAMIC_STATE_P (t->dynamic_state)) + { + SCM v = SCM_I_DYNAMIC_STATE_FLUIDS (t->dynamic_state); + + if (n < SCM_SIMPLE_VECTOR_LENGTH (v)) + SCM_SIMPLE_VECTOR_SET (v, n, val); + } + scm_i_pthread_mutex_unlock (&thread_admin_mutex); +} + /* Perform first stage of thread initialisation, in non-guile mode. */ static void -- cgit v1.2.3