mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-22 12:30:32 +02:00
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.
This commit is contained in:
parent
2dd4948644
commit
0b77014f0c
3 changed files with 24 additions and 0 deletions
|
@ -163,6 +163,11 @@ new_fluid ()
|
||||||
SCM2PTR (fluid));
|
SCM2PTR (fluid));
|
||||||
|
|
||||||
scm_dynwind_end ();
|
scm_dynwind_end ();
|
||||||
|
|
||||||
|
/* Now null out values. We could (and probably should) do this when
|
||||||
|
the fluid is collected instead of now. */
|
||||||
|
scm_i_reset_fluid (n, SCM_BOOL_F);
|
||||||
|
|
||||||
return fluid;
|
return fluid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -484,6 +484,24 @@ static int thread_count;
|
||||||
|
|
||||||
static SCM scm_i_default_dynamic_state;
|
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.
|
/* Perform first stage of thread initialisation, in non-guile mode.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -136,6 +136,7 @@ SCM_API SCM scm_spawn_thread (scm_t_catch_body body, void *body_data,
|
||||||
SCM_API void *scm_without_guile (void *(*func)(void *), void *data);
|
SCM_API void *scm_without_guile (void *(*func)(void *), void *data);
|
||||||
SCM_API void *scm_with_guile (void *(*func)(void *), void *data);
|
SCM_API void *scm_with_guile (void *(*func)(void *), void *data);
|
||||||
|
|
||||||
|
SCM_INTERNAL void scm_i_reset_fluid (size_t, SCM);
|
||||||
SCM_INTERNAL void scm_threads_prehistory (void *);
|
SCM_INTERNAL void scm_threads_prehistory (void *);
|
||||||
SCM_INTERNAL void scm_init_threads (void);
|
SCM_INTERNAL void scm_init_threads (void);
|
||||||
SCM_INTERNAL void scm_init_thread_procs (void);
|
SCM_INTERNAL void scm_init_thread_procs (void);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue