wingo pushed a commit to branch wip-whippet in repository guile. commit 552960b3e2edc13595fbaf9d550235c723601595 Author: Andy Wingo <wi...@pobox.com> AuthorDate: Wed Jun 25 10:46:43 2025 +0200
Move struct scm_thread definition to private header Allows us to inline the "struct scm_dynamic_state", avoiding an untagged traced allocation. * libguile/threads-internal.h: New file. * libguile/Makefile.am (noinst_HEADERS): Add new file. Adapt all users, notably of SCM_I_CURRENT_THREAD and scm_i_misc_mutex. --- libguile/Makefile.am | 1 + libguile/arrays.c | 2 +- libguile/async.c | 1 + libguile/atomic.c | 2 +- libguile/bitvectors.c | 2 +- libguile/bytevectors.c | 2 +- libguile/control.c | 2 +- libguile/deprecated.c | 2 +- libguile/deprecation.c | 4 +- libguile/dynl.c | 4 +- libguile/dynstack.c | 6 +- libguile/dynwind.c | 2 +- libguile/ephemerons.c | 2 +- libguile/error.c | 3 +- libguile/eval.c | 2 +- libguile/exceptions.c | 2 +- libguile/extensions.c | 4 +- libguile/fdes-finalizers.c | 4 +- libguile/filesys.c | 1 + libguile/finalizers.c | 2 +- libguile/fluids.c | 26 +++---- libguile/foreign-object.c | 2 +- libguile/foreign.c | 2 +- libguile/fports.c | 1 + libguile/frames.c | 2 +- libguile/gc-inline.h | 2 +- libguile/gc-malloc.c | 2 +- libguile/gsubr.c | 2 +- libguile/hashtab.c | 2 +- libguile/i18n.c | 2 +- libguile/instructions.c | 4 +- libguile/integers.c | 2 +- libguile/intrinsics.c | 14 ++-- libguile/jit.c | 2 +- libguile/keywords.c | 2 +- libguile/load.c | 2 +- libguile/loader.c | 2 +- libguile/macros.c | 2 +- libguile/memoize.c | 10 +-- libguile/modules.c | 2 +- libguile/null-threads.c | 4 +- libguile/numbers.c | 2 +- libguile/options.c | 2 +- libguile/pairs.c | 2 +- libguile/ports.c | 3 +- libguile/posix-w32.c | 2 +- libguile/posix.c | 2 +- libguile/print.c | 2 +- libguile/procprop.c | 2 +- libguile/programs.h | 4 +- libguile/r6rs-ports.c | 2 +- libguile/random.c | 7 +- libguile/read.c | 2 +- libguile/regex-posix.c | 1 + libguile/scmsigs.c | 2 +- libguile/smob.c | 2 +- libguile/srfi-14.c | 2 +- libguile/stackchk.c | 4 +- libguile/stackchk.h | 3 +- libguile/stacks.c | 2 +- libguile/strings.c | 2 +- libguile/strports.c | 2 +- libguile/struct.c | 1 + libguile/symbols.c | 2 +- libguile/syntax.c | 2 +- libguile/{threads.h => threads-internal.h} | 112 +++-------------------------- libguile/threads.c | 10 ++- libguile/threads.h | 103 +------------------------- libguile/trace.h | 6 +- libguile/values.c | 2 +- libguile/variable.c | 2 +- libguile/vectors.c | 2 +- libguile/vports.c | 4 +- 73 files changed, 125 insertions(+), 312 deletions(-) diff --git a/libguile/Makefile.am b/libguile/Makefile.am index 0e2e5d300..968361f2c 100644 --- a/libguile/Makefile.am +++ b/libguile/Makefile.am @@ -529,6 +529,7 @@ noinst_HEADERS = atomic.h \ regex-posix.h \ strings-internal.h \ syntax.h \ + threads-internal.h \ trace.h \ vectors-internal.h \ whippet-embedder.h diff --git a/libguile/arrays.c b/libguile/arrays.c index 764849850..436f8cb6c 100644 --- a/libguile/arrays.c +++ b/libguile/arrays.c @@ -49,7 +49,7 @@ #include "srfi-13.h" #include "srfi-4.h" #include "strings.h" -#include "threads.h" +#include "threads-internal.h" #include "uniform.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/async.c b/libguile/async.c index f9c354545..335edc892 100644 --- a/libguile/async.c +++ b/libguile/async.c @@ -36,6 +36,7 @@ #include "list.h" #include "pairs.h" #include "throw.h" +#include "threads-internal.h" #include "async.h" diff --git a/libguile/atomic.c b/libguile/atomic.c index a091efe42..29d49051b 100644 --- a/libguile/atomic.c +++ b/libguile/atomic.c @@ -29,7 +29,7 @@ #include "extensions.h" #include "gsubr.h" #include "ports.h" -#include "threads.h" +#include "threads-internal.h" #include "version.h" #include "atomic.h" diff --git a/libguile/bitvectors.c b/libguile/bitvectors.c index 3a90fb9b9..cfe7893ef 100644 --- a/libguile/bitvectors.c +++ b/libguile/bitvectors.c @@ -37,7 +37,7 @@ #include "pairs.h" #include "ports.h" #include "srfi-4.h" -#include "threads.h" +#include "threads-internal.h" #include "bitvectors.h" diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c index 5734aafaa..ee73b03bb 100644 --- a/libguile/bytevectors.c +++ b/libguile/bytevectors.c @@ -56,7 +56,7 @@ #include "srfi-4.h" #include "strings-internal.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "uniform.h" #include "version.h" diff --git a/libguile/control.c b/libguile/control.c index a38b78e4f..e9bbd252e 100644 --- a/libguile/control.c +++ b/libguile/control.c @@ -32,7 +32,7 @@ #include "list.h" #include "pairs.h" #include "programs.h" -#include "threads.h" +#include "threads-internal.h" #include "version.h" #include "vm.h" diff --git a/libguile/deprecated.c b/libguile/deprecated.c index 16bdbc4e1..b51fb7160 100644 --- a/libguile/deprecated.c +++ b/libguile/deprecated.c @@ -33,7 +33,7 @@ #include "numbers.h" #include "ports.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/deprecation.c b/libguile/deprecation.c index a85ed1972..9dc0a6331 100644 --- a/libguile/deprecation.c +++ b/libguile/deprecation.c @@ -1,4 +1,4 @@ -/* Copyright 2001,2005-2006,2009-2012,2016,2018-2019 +/* Copyright 2001,2005-2006,2009-2012,2016,2018-2019,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -33,7 +33,7 @@ #include "ports.h" #include "private-options.h" #include "strings.h" -#include "threads.h" +#include "threads-internal.h" #include "deprecation.h" diff --git a/libguile/dynl.c b/libguile/dynl.c index 6bab9bd32..de9324e39 100644 --- a/libguile/dynl.c +++ b/libguile/dynl.c @@ -1,6 +1,6 @@ /* dynl.c - dynamic linking - Copyright 1990-2003,2008-2011,2017-2018,2021 + Copyright 1990-2003,2008-2011,2017-2018,2021,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -48,7 +48,7 @@ #include "modules.h" #include "numbers.h" #include "strings.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "version.h" diff --git a/libguile/dynstack.c b/libguile/dynstack.c index 847925fe9..25a1f11eb 100644 --- a/libguile/dynstack.c +++ b/libguile/dynstack.c @@ -36,7 +36,7 @@ #include "eval.h" #include "fluids-internal.h" #include "variable.h" -#include "threads.h" +#include "threads-internal.h" #include "trace.h" #include "dynstack.h" @@ -442,7 +442,7 @@ scm_dynstack_wind_1 (scm_t_dynstack *dynstack, scm_t_bits *item) case SCM_DYNSTACK_TYPE_WITH_FLUID: scm_swap_fluid (WITH_FLUID_FLUID (item), WITH_FLUID_VALUE_BOX (item), - SCM_I_CURRENT_THREAD->dynamic_state); + &SCM_I_CURRENT_THREAD->dynamic_state); break; case SCM_DYNSTACK_TYPE_PROMPT: @@ -499,7 +499,7 @@ scm_dynstack_unwind_1 (scm_t_dynstack *dynstack) case SCM_DYNSTACK_TYPE_WITH_FLUID: scm_swap_fluid (WITH_FLUID_FLUID (words), WITH_FLUID_VALUE_BOX (words), - SCM_I_CURRENT_THREAD->dynamic_state); + &SCM_I_CURRENT_THREAD->dynamic_state); clear_scm_t_bits (words, WITH_FLUID_WORDS); break; diff --git a/libguile/dynwind.c b/libguile/dynwind.c index e784b1e17..8a1a2a771 100644 --- a/libguile/dynwind.c +++ b/libguile/dynwind.c @@ -28,7 +28,7 @@ #include "eval.h" #include "pairs.h" #include "ports.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "dynwind.h" diff --git a/libguile/ephemerons.c b/libguile/ephemerons.c index 29ee615b4..73fa1f3d8 100644 --- a/libguile/ephemerons.c +++ b/libguile/ephemerons.c @@ -37,7 +37,7 @@ #include "hash.h" #include "numbers.h" #include "ports.h" -#include "threads.h" +#include "threads-internal.h" #include "trace.h" #include "version.h" diff --git a/libguile/error.c b/libguile/error.c index aa45aec27..d74b17ba5 100644 --- a/libguile/error.c +++ b/libguile/error.c @@ -1,4 +1,4 @@ -/* Copyright 1995-1998,2000-2001,2004,2006,2010,2012-2016,2018-2019 +/* Copyright 1995-1998,2000-2001,2004,2006,2010,2012-2016,2018-2019,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -45,6 +45,7 @@ #include "strings.h" #include "symbols.h" #include "throw.h" +#include "threads-internal.h" #include "error.h" diff --git a/libguile/eval.c b/libguile/eval.c index 625dc1aa2..e53d7c89f 100644 --- a/libguile/eval.c +++ b/libguile/eval.c @@ -58,7 +58,7 @@ #include "stackchk.h" #include "strings.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "throw.h" #include "values.h" #include "variable.h" diff --git a/libguile/exceptions.c b/libguile/exceptions.c index 54cec0fb0..ccaa04f63 100644 --- a/libguile/exceptions.c +++ b/libguile/exceptions.c @@ -137,7 +137,7 @@ scm_c_with_exception_handler (SCM type, scm_t_exception_handler handler, SCM prompt_tag = scm_cons (SCM_INUM0, SCM_EOL); scm_thread *t = SCM_I_CURRENT_THREAD; scm_t_dynstack *dynstack = &t->dynstack; - scm_t_dynamic_state *dynamic_state = t->dynamic_state; + scm_t_dynamic_state *dynamic_state = &t->dynamic_state; jmp_buf registers; jmp_buf *prev_registers; ptrdiff_t saved_stack_depth; diff --git a/libguile/extensions.c b/libguile/extensions.c index 61c975e16..f504a6c20 100644 --- a/libguile/extensions.c +++ b/libguile/extensions.c @@ -1,4 +1,4 @@ -/* Copyright 2001,2002,2004,2006,2009-2011,2018-2019,2021 +/* Copyright 2001,2002,2004,2006,2009-2011,2018-2019,2021,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -29,7 +29,7 @@ #include "gsubr.h" #include "foreign.h" #include "strings.h" -#include "threads.h" +#include "threads-internal.h" #include "extensions.h" diff --git a/libguile/fdes-finalizers.c b/libguile/fdes-finalizers.c index 4b3fced02..bf46cd638 100644 --- a/libguile/fdes-finalizers.c +++ b/libguile/fdes-finalizers.c @@ -1,4 +1,4 @@ -/* Copyright 2016,2018 +/* Copyright 2016,2018,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -30,7 +30,7 @@ #include "list.h" #include "numbers.h" #include "pairs.h" -#include "threads.h" +#include "threads-internal.h" #include "version.h" #include "fdes-finalizers.h" diff --git a/libguile/filesys.c b/libguile/filesys.c index 1e928c4dc..ce090b9d1 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -94,6 +94,7 @@ #include "strings.h" #include "symbols.h" #include "syscalls.h" +#include "threads-internal.h" #include "vectors.h" #include "filesys.h" diff --git a/libguile/finalizers.c b/libguile/finalizers.c index 0ef7a2b64..961a59a29 100644 --- a/libguile/finalizers.c +++ b/libguile/finalizers.c @@ -51,7 +51,7 @@ #include "struct.h" #include "symbols.h" #include "trace.h" -#include "threads.h" +#include "threads-internal.h" #include "version.h" #include <gc-finalizer.h> diff --git a/libguile/fluids.c b/libguile/fluids.c index c2d7cfebd..462734050 100644 --- a/libguile/fluids.c +++ b/libguile/fluids.c @@ -38,7 +38,7 @@ #include "pairs.h" #include "ports.h" #include "print.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" @@ -350,7 +350,7 @@ fluid_ref (scm_t_dynamic_state *dynamic_state, SCM fluid) SCM scm_i_fluid_ref (scm_thread *thread, SCM fluid) { - SCM ret = fluid_ref (thread->dynamic_state, fluid); + SCM ret = fluid_ref (&thread->dynamic_state, fluid); if (SCM_UNBNDP (ret)) scm_misc_error ("fluid-ref", "unbound fluid: ~S", scm_list_1 (fluid)); @@ -390,7 +390,7 @@ SCM_DEFINE (scm_fluid_ref_star, "fluid-ref*", 2, 0, 0, disappearing link. */ if (c_depth == 0) { - scm_t_dynamic_state *dynamic_state = SCM_I_CURRENT_THREAD->dynamic_state; + scm_t_dynamic_state *dynamic_state = &SCM_I_CURRENT_THREAD->dynamic_state; struct scm_cache_entry *entry; entry = scm_cache_lookup (&dynamic_state->cache, fluid); @@ -429,7 +429,7 @@ SCM_DEFINE (scm_fluid_set_x, "fluid-set!", 2, 0, 0, #define FUNC_NAME s_scm_fluid_set_x { SCM_VALIDATE_FLUID (1, fluid); - fluid_set_x (SCM_I_CURRENT_THREAD->dynamic_state, fluid, value); + fluid_set_x (&SCM_I_CURRENT_THREAD->dynamic_state, fluid, value); return SCM_UNSPECIFIED; } #undef FUNC_NAME @@ -443,7 +443,7 @@ SCM_DEFINE (scm_fluid_unset_x, "fluid-unset!", 1, 0, 0, suite demands it, but I would prefer not to. */ SCM_VALIDATE_FLUID (1, fluid); SCM_SET_CELL_OBJECT_1 (fluid, SCM_UNDEFINED); - fluid_set_x (SCM_I_CURRENT_THREAD->dynamic_state, fluid, SCM_UNDEFINED); + fluid_set_x (&SCM_I_CURRENT_THREAD->dynamic_state, fluid, SCM_UNDEFINED); return SCM_UNSPECIFIED; } #undef FUNC_NAME @@ -456,7 +456,7 @@ SCM_DEFINE (scm_fluid_bound_p, "fluid-bound?", 1, 0, 0, { SCM val; SCM_VALIDATE_FLUID (1, fluid); - val = fluid_ref (SCM_I_CURRENT_THREAD->dynamic_state, fluid); + val = fluid_ref (&SCM_I_CURRENT_THREAD->dynamic_state, fluid); return scm_from_bool (! (SCM_UNBNDP (val))); } #undef FUNC_NAME @@ -505,7 +505,7 @@ scm_c_with_fluids (SCM fluids, SCM values, SCM (*cproc) (), void *cdata) { scm_dynstack_push_fluid (&thread->dynstack, SCM_CAR (fluids), SCM_CAR (values), - thread->dynamic_state); + &thread->dynamic_state); fluids = SCM_CDR (fluids); values = SCM_CDR (values); } @@ -513,7 +513,7 @@ scm_c_with_fluids (SCM fluids, SCM values, SCM (*cproc) (), void *cdata) ans = cproc (cdata); for (i = 0; i < flen; i++) - scm_dynstack_unwind_fluid (&thread->dynstack, thread->dynamic_state); + scm_dynstack_unwind_fluid (&thread->dynstack, &thread->dynamic_state); return ans; } @@ -534,9 +534,9 @@ scm_c_with_fluid (SCM fluid, SCM value, SCM (*cproc) (), void *cdata) scm_thread *thread = SCM_I_CURRENT_THREAD; scm_dynstack_push_fluid (&thread->dynstack, fluid, value, - thread->dynamic_state); + &thread->dynamic_state); ans = cproc (cdata); - scm_dynstack_unwind_fluid (&thread->dynstack, thread->dynamic_state); + scm_dynstack_unwind_fluid (&thread->dynstack, &thread->dynamic_state); return ans; } @@ -545,7 +545,7 @@ scm_c_with_fluid (SCM fluid, SCM value, SCM (*cproc) (), void *cdata) static void swap_fluid (SCM data) { - scm_t_dynamic_state *dynstate = SCM_I_CURRENT_THREAD->dynamic_state; + scm_t_dynamic_state *dynstate = &SCM_I_CURRENT_THREAD->dynamic_state; SCM f = SCM_CAR (data); SCM t = fluid_ref (dynstate, f); fluid_set_x (dynstate, f, SCM_CDR (data)); @@ -591,7 +591,7 @@ SCM_DEFINE (scm_current_dynamic_state, "current-dynamic-state", 0, 0, 0, struct scm_dynamic_state_snapshot *snapshot = scm_allocate_tagged (thr, sizeof (*snapshot)); snapshot->tag = scm_tc7_dynamic_state; - snapshot->bindings = save_dynamic_state (thr->dynamic_state); + snapshot->bindings = save_dynamic_state (&thr->dynamic_state); return scm_from_dynamic_state (snapshot); } #undef FUNC_NAME @@ -606,7 +606,7 @@ SCM_DEFINE (scm_set_current_dynamic_state, "set-current-dynamic-state", 1,0,0, SCM old = scm_current_dynamic_state (); SCM_ASSERT (scm_is_dynamic_state (state), state, SCM_ARG1, FUNC_NAME); restore_dynamic_state (scm_to_dynamic_state (state)->bindings, - t->dynamic_state); + &t->dynamic_state); return old; } #undef FUNC_NAME diff --git a/libguile/foreign-object.c b/libguile/foreign-object.c index 95cc0bfee..a513bdd14 100644 --- a/libguile/foreign-object.c +++ b/libguile/foreign-object.c @@ -31,7 +31,7 @@ #include "modules.h" #include "numbers.h" #include "procs.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "version.h" diff --git a/libguile/foreign.c b/libguile/foreign.c index 2ce9a1d4f..5ccf481d8 100644 --- a/libguile/foreign.c +++ b/libguile/foreign.c @@ -53,7 +53,7 @@ #include "stacks.h" #include "strings-internal.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "version.h" #include "uniform.h" diff --git a/libguile/fports.c b/libguile/fports.c index 93d065c60..9e718fc8c 100644 --- a/libguile/fports.c +++ b/libguile/fports.c @@ -66,6 +66,7 @@ #include "strings-internal.h" #include "symbols.h" #include "syscalls.h" +#include "threads-internal.h" #include "variable.h" #include "version.h" diff --git a/libguile/frames.c b/libguile/frames.c index 8f98b1846..a69a6eb48 100644 --- a/libguile/frames.c +++ b/libguile/frames.c @@ -35,7 +35,7 @@ #include "ports.h" #include "programs.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "version.h" #include "vm.h" diff --git a/libguile/gc-inline.h b/libguile/gc-inline.h index 88c8efc16..5b53a67f6 100644 --- a/libguile/gc-inline.h +++ b/libguile/gc-inline.h @@ -41,7 +41,7 @@ #include "libguile/gc.h" #include "libguile/gc-internal.h" -#include "libguile/threads.h" +#include "libguile/threads-internal.h" diff --git a/libguile/gc-malloc.c b/libguile/gc-malloc.c index 647d391df..229e2c98d 100644 --- a/libguile/gc-malloc.c +++ b/libguile/gc-malloc.c @@ -28,7 +28,7 @@ #include <unistd.h> #include "gc-inline.h" -#include "threads.h" +#include "threads-internal.h" #include "gc.h" diff --git a/libguile/gsubr.c b/libguile/gsubr.c index 36e30115a..ce0df76b8 100644 --- a/libguile/gsubr.c +++ b/libguile/gsubr.c @@ -39,7 +39,7 @@ #include "programs.h" #include "srfi-4.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "vectors.h" #include "gsubr-internal.h" diff --git a/libguile/hashtab.c b/libguile/hashtab.c index f19b24e39..ffac51184 100644 --- a/libguile/hashtab.c +++ b/libguile/hashtab.c @@ -40,7 +40,7 @@ #include "pairs.h" #include "ports.h" #include "procs.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/i18n.c b/libguile/i18n.c index 2303ad494..066960d1b 100644 --- a/libguile/i18n.c +++ b/libguile/i18n.c @@ -44,7 +44,7 @@ #include "strings-internal.h" #include "symbols.h" #include "syscalls.h" -#include "threads.h" +#include "threads-internal.h" #include "values.h" #include "variable.h" #include "version.h" diff --git a/libguile/instructions.c b/libguile/instructions.c index dcee8a281..b33619de4 100644 --- a/libguile/instructions.c +++ b/libguile/instructions.c @@ -1,4 +1,4 @@ -/* Copyright 2001,2009-2013,2017-2018,2020 +/* Copyright 2001,2009-2013,2017-2018,2020,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -27,7 +27,7 @@ #include "numbers.h" #include "pairs.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "version.h" #include "instructions.h" diff --git a/libguile/integers.c b/libguile/integers.c index 6c10d6ce4..09fbe6bce 100644 --- a/libguile/integers.c +++ b/libguile/integers.c @@ -33,7 +33,7 @@ #include "boolean.h" #include "numbers.h" #include "strings.h" -#include "threads.h" +#include "threads-internal.h" #include "integers.h" diff --git a/libguile/intrinsics.c b/libguile/intrinsics.c index 30ce7531d..f60b3f479 100644 --- a/libguile/intrinsics.c +++ b/libguile/intrinsics.c @@ -40,7 +40,7 @@ #include "strings-internal.h" #include "struct.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "version.h" @@ -179,13 +179,13 @@ static void push_fluid (scm_thread *thread, SCM fluid, SCM value) { scm_dynstack_push_fluid (&thread->dynstack, fluid, value, - thread->dynamic_state); + &thread->dynamic_state); } static void pop_fluid (scm_thread *thread) { - scm_dynstack_unwind_fluid (&thread->dynstack, thread->dynamic_state); + scm_dynstack_unwind_fluid (&thread->dynstack, &thread->dynamic_state); } static SCM @@ -194,7 +194,7 @@ fluid_ref (scm_thread *thread, SCM fluid) struct scm_cache_entry *entry; /* If we find FLUID in the cache, then it is indeed a fluid. */ - entry = scm_cache_lookup (&thread->dynamic_state->cache, fluid); + entry = scm_cache_lookup (&thread->dynamic_state.cache, fluid); if (SCM_LIKELY (scm_is_eq (SCM_PACK (entry->key), fluid) && !SCM_UNBNDP (SCM_PACK (entry->value)))) return SCM_PACK (entry->value); @@ -208,7 +208,7 @@ fluid_set_x (scm_thread *thread, SCM fluid, SCM value) struct scm_cache_entry *entry; /* If we find FLUID in the cache, then it is indeed a fluid. */ - entry = scm_cache_lookup (&thread->dynamic_state->cache, fluid); + entry = scm_cache_lookup (&thread->dynamic_state.cache, fluid); if (SCM_LIKELY (scm_is_eq (SCM_PACK (entry->key), fluid))) entry->value = SCM_UNPACK (value); else @@ -219,14 +219,14 @@ static void push_dynamic_state (scm_thread *thread, SCM state) { scm_dynstack_push_dynamic_state (&thread->dynstack, state, - thread->dynamic_state); + &thread->dynamic_state); } static void pop_dynamic_state (scm_thread *thread) { scm_dynstack_unwind_dynamic_state (&thread->dynstack, - thread->dynamic_state); + &thread->dynamic_state); } static SCM diff --git a/libguile/jit.c b/libguile/jit.c index 877b4c542..b8f0e9593 100644 --- a/libguile/jit.c +++ b/libguile/jit.c @@ -34,7 +34,7 @@ #include "instructions.h" #include "intrinsics.h" #include "simpos.h" /* scm_getenv_int */ -#include "threads.h" +#include "threads-internal.h" #include "vm-builtins.h" #include "vm-operations.h" diff --git a/libguile/keywords.c b/libguile/keywords.c index 019641a02..798886edc 100644 --- a/libguile/keywords.c +++ b/libguile/keywords.c @@ -35,7 +35,7 @@ #include "ports.h" #include "strings.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "keywords-internal.h" diff --git a/libguile/load.c b/libguile/load.c index 4de4eda53..320c1e590 100644 --- a/libguile/load.c +++ b/libguile/load.c @@ -58,7 +58,7 @@ #include "strings-internal.h" #include "strports.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "throw.h" #include "variable.h" #include "version.h" diff --git a/libguile/loader.c b/libguile/loader.c index e9360b119..b9ddc6698 100644 --- a/libguile/loader.c +++ b/libguile/loader.c @@ -48,7 +48,7 @@ #include "pairs.h" #include "programs.h" #include "strings.h" -#include "threads.h" +#include "threads-internal.h" #include "trace.h" #include "version.h" diff --git a/libguile/macros.c b/libguile/macros.c index a086ff8a0..1a8a10dff 100644 --- a/libguile/macros.c +++ b/libguile/macros.c @@ -32,7 +32,7 @@ #include "procs.h" #include "random.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "macros.h" diff --git a/libguile/memoize.c b/libguile/memoize.c index 7ea92abc2..cfad6babc 100644 --- a/libguile/memoize.c +++ b/libguile/memoize.c @@ -42,7 +42,7 @@ #include "print.h" #include "strings-internal.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "throw.h" #include "variable.h" #include "vectors.h" @@ -99,7 +99,7 @@ do_push_fluid (SCM fluid, SCM val) { scm_thread *thread = SCM_I_CURRENT_THREAD; scm_dynstack_push_fluid (&thread->dynstack, fluid, val, - thread->dynamic_state); + &thread->dynamic_state); return SCM_UNSPECIFIED; } @@ -107,7 +107,7 @@ static SCM do_pop_fluid (void) { scm_thread *thread = SCM_I_CURRENT_THREAD; - scm_dynstack_unwind_fluid (&thread->dynstack, thread->dynamic_state); + scm_dynstack_unwind_fluid (&thread->dynstack, &thread->dynamic_state); return SCM_UNSPECIFIED; } @@ -116,7 +116,7 @@ do_push_dynamic_state (SCM state) { scm_thread *thread = SCM_I_CURRENT_THREAD; scm_dynstack_push_dynamic_state (&thread->dynstack, state, - thread->dynamic_state); + &thread->dynamic_state); return SCM_UNSPECIFIED; } @@ -125,7 +125,7 @@ do_pop_dynamic_state (void) { scm_thread *thread = SCM_I_CURRENT_THREAD; scm_dynstack_unwind_dynamic_state (&thread->dynstack, - thread->dynamic_state); + &thread->dynamic_state); return SCM_UNSPECIFIED; } diff --git a/libguile/modules.c b/libguile/modules.c index 51138a7d7..91b0abb1a 100644 --- a/libguile/modules.c +++ b/libguile/modules.c @@ -37,7 +37,7 @@ #include "procprop.h" #include "struct.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/null-threads.c b/libguile/null-threads.c index aa6dbdfa1..354a1ca3d 100644 --- a/libguile/null-threads.c +++ b/libguile/null-threads.c @@ -1,4 +1,4 @@ -/* Copyright 2002,2006,2008,2018 +/* Copyright 2002,2006,2008,2018,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -27,7 +27,7 @@ #if SCM_USE_NULL_THREADS -#include "null-threads.h" +#include "null-threads-internal.h" static scm_i_pthread_key_t *all_keys = NULL; diff --git a/libguile/numbers.c b/libguile/numbers.c index fbd44fe2d..73417f909 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -71,7 +71,7 @@ #include "ports.h" #include "simpos.h" #include "strings-internal.h" -#include "threads.h" +#include "threads-internal.h" #include "values.h" #include "numbers.h" diff --git a/libguile/options.c b/libguile/options.c index d3aa1a370..9d8159ec4 100644 --- a/libguile/options.c +++ b/libguile/options.c @@ -28,7 +28,7 @@ #include "pairs.h" #include "strings.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "options.h" diff --git a/libguile/pairs.c b/libguile/pairs.c index acf6d3e86..783077493 100644 --- a/libguile/pairs.c +++ b/libguile/pairs.c @@ -28,7 +28,7 @@ #include "boolean.h" #include "gc-internal.h" #include "trace.h" -#include "threads.h" +#include "threads-internal.h" #include "gsubr.h" #include "pairs.h" diff --git a/libguile/ports.c b/libguile/ports.c index bbe9af2b8..c2b79ab0e 100644 --- a/libguile/ports.c +++ b/libguile/ports.c @@ -73,6 +73,7 @@ #include "strings-internal.h" #include "symbols.h" #include "syscalls.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" #include "version.h" @@ -800,7 +801,7 @@ scm_c_make_port_with_encoding (scm_t_port_type *ptob, unsigned long mode_bits, SCM encoding, SCM conversion_strategy, scm_t_bits stream) { - scm_t_port *pt = scm_gc_typed_calloc (scm_t_port); + scm_t_port *pt = scm_allocate_tagged (SCM_I_CURRENT_THREAD, sizeof (*pt)); pt->tag_and_flags = scm_tc7_port | mode_bits | SCM_OPN; pt->ptob = ptob; pt->stream = stream; diff --git a/libguile/posix-w32.c b/libguile/posix-w32.c index 239fd1156..76772855d 100644 --- a/libguile/posix-w32.c +++ b/libguile/posix-w32.c @@ -34,7 +34,7 @@ #include <fcntl.h> #include "gc.h" /* for scm_*alloc, scm_strdup */ -#include "threads.h" /* for scm_i_scm_pthread_mutex_lock */ +#include "threads-internal.h" /* for scm_i_scm_pthread_mutex_lock */ #include "posix-w32.h" diff --git a/libguile/posix.c b/libguile/posix.c index 6cad7bb0d..3e75b6992 100644 --- a/libguile/posix.c +++ b/libguile/posix.c @@ -76,7 +76,7 @@ #include "strings-internal.h" #include "symbols.h" #include "syscalls.h" -#include "threads.h" +#include "threads-internal.h" #include "values.h" #include "vectors.h" #include "verify.h" diff --git a/libguile/print.c b/libguile/print.c index 4c1773222..949d7e572 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -68,7 +68,7 @@ #include "struct.h" #include "symbols.h" #include "syntax.h" -#include "threads.h" +#include "threads-internal.h" #include "values.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/procprop.c b/libguile/procprop.c index 51a7a1d0f..07b563c0a 100644 --- a/libguile/procprop.c +++ b/libguile/procprop.c @@ -36,7 +36,7 @@ #include "programs.h" #include "smob.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "vectors.h" #include "vm-builtins.h" diff --git a/libguile/programs.h b/libguile/programs.h index 667daa86d..7fcf41672 100644 --- a/libguile/programs.h +++ b/libguile/programs.h @@ -21,7 +21,7 @@ #define _SCM_PROGRAMS_H_ #include <libguile/gc.h> -#include <libguile/threads.h> +#include "threads-internal.h" /* * Programs @@ -123,8 +123,6 @@ scm_program_free_variable_set_x (struct scm_program *program, size_t idx, SCM v) program->free_variables[idx] = v; } -#include "threads.h" - static inline SCM scm_i_make_program (const uint32_t *code) { diff --git a/libguile/r6rs-ports.c b/libguile/r6rs-ports.c index 59a315ff5..5b811736c 100644 --- a/libguile/r6rs-ports.c +++ b/libguile/r6rs-ports.c @@ -39,7 +39,7 @@ #include "strings.h" #include "symbols.h" #include "syscalls.h" -#include "threads.h" +#include "threads-internal.h" #include "values.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/random.c b/libguile/random.c index b8580f857..09c7ab6cf 100644 --- a/libguile/random.c +++ b/libguile/random.c @@ -50,7 +50,7 @@ #include "stime.h" #include "strings-internal.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" @@ -328,9 +328,7 @@ scm_c_random_bignum (scm_t_rstate *state, SCM m) /* we know the result will be this big */ mpz_realloc2 (result, m_bits); - random_chunks = - (uint32_t *) scm_gc_calloc (num_chunks * sizeof (uint32_t), - "random bignum chunks"); + random_chunks = scm_calloc (num_chunks * sizeof (uint32_t)); do { @@ -370,6 +368,7 @@ scm_c_random_bignum (scm_t_rstate *state, SCM m) mpz_clear (zm); SCM ret = scm_from_mpz (result); mpz_clear (result); + free (random_chunks); return ret; } diff --git a/libguile/read.c b/libguile/read.c index 799b395b8..b64984c89 100644 --- a/libguile/read.c +++ b/libguile/read.c @@ -59,7 +59,7 @@ #include "strings-internal.h" #include "strports.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/regex-posix.c b/libguile/regex-posix.c index 4cec6efc1..593ed97c5 100644 --- a/libguile/regex-posix.c +++ b/libguile/regex-posix.c @@ -50,6 +50,7 @@ #include "strings.h" #include "strports.h" #include "symbols.h" +#include "threads-internal.h" #include "vectors.h" #include "version.h" diff --git a/libguile/scmsigs.c b/libguile/scmsigs.c index 558391a4b..88fbd760c 100644 --- a/libguile/scmsigs.c +++ b/libguile/scmsigs.c @@ -55,7 +55,7 @@ #include "pairs.h" #include "procs.h" #include "syscalls.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/smob.c b/libguile/smob.c index e6c1c82eb..e96ca554d 100644 --- a/libguile/smob.c +++ b/libguile/smob.c @@ -37,7 +37,7 @@ #include "numbers.h" #include "ports.h" #include "programs.h" -#include "threads.h" +#include "threads-internal.h" #include "smob.h" diff --git a/libguile/srfi-14.c b/libguile/srfi-14.c index 9cf6de03d..7f8ff2f7d 100644 --- a/libguile/srfi-14.c +++ b/libguile/srfi-14.c @@ -39,7 +39,7 @@ #include "procs.h" #include "strings-internal.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "values.h" #include "version.h" diff --git a/libguile/stackchk.c b/libguile/stackchk.c index a9bf133c2..842f04801 100644 --- a/libguile/stackchk.c +++ b/libguile/stackchk.c @@ -1,4 +1,4 @@ -/* Copyright 1995-1997,2000-2001,2006,2008,2010-2011,2014,2018 +/* Copyright 1995-1997,2000-2001,2006,2008,2010-2011,2014,2018,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -28,7 +28,7 @@ #include "gsubr.h" #include "numbers.h" #include "ports.h" -#include "threads.h" +#include "threads-internal.h" #include "stackchk.h" diff --git a/libguile/stackchk.h b/libguile/stackchk.h index 75688ec3b..75d576593 100644 --- a/libguile/stackchk.h +++ b/libguile/stackchk.h @@ -1,7 +1,7 @@ #ifndef SCM_STACKCHK_H #define SCM_STACKCHK_H -/* Copyright 1995-1996,1998,2000,2003,2006,2008-2011,2014,2018 +/* Copyright 1995-1996,1998,2000,2003,2006,2008-2011,2014,2018,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -32,6 +32,7 @@ #define SCM_STACK_CHECKING_P SCM_STACK_LIMIT #if defined BUILDING_LIBGUILE +#include "libguile/threads-internal.h" #include "libguile/private-options.h" # if SCM_STACK_GROWS_UP # define SCM_STACK_OVERFLOW_P(s)\ diff --git a/libguile/stacks.c b/libguile/stacks.c index 0800b0a2d..d5c754dcc 100644 --- a/libguile/stacks.c +++ b/libguile/stacks.c @@ -43,7 +43,7 @@ #include "strings.h" #include "struct.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "vm.h" /* to capture vm stacks */ #include "stacks.h" diff --git a/libguile/strings.c b/libguile/strings.c index c010bef78..0b55e9751 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -47,7 +47,7 @@ #include "private-options.h" #include "striconveh.h" #include "symbols.h" -#include "threads.h" +#include "threads-internal.h" #include "strings-internal.h" diff --git a/libguile/strports.c b/libguile/strports.c index f0a2e37ba..051ce62ee 100644 --- a/libguile/strports.c +++ b/libguile/strports.c @@ -42,7 +42,7 @@ #include "strings-internal.h" #include "symbols.h" #include "syscalls.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/struct.c b/libguile/struct.c index 288ad84c7..51a31f32e 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -47,6 +47,7 @@ #include "srfi-13.h" #include "strings-internal.h" #include "symbols.h" +#include "threads-internal.h" #include "struct.h" diff --git a/libguile/symbols.c b/libguile/symbols.c index b656c6ae8..c1f09632e 100644 --- a/libguile/symbols.c +++ b/libguile/symbols.c @@ -43,7 +43,7 @@ #include "srfi-13.h" #include "strings-internal.h" #include "strorder.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/syntax.c b/libguile/syntax.c index 6df72f3f1..e86556fba 100644 --- a/libguile/syntax.c +++ b/libguile/syntax.c @@ -31,7 +31,7 @@ #include "modules.h" #include "pairs.h" #include "ports.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vectors.h" diff --git a/libguile/threads.h b/libguile/threads-internal.h similarity index 52% copy from libguile/threads.h copy to libguile/threads-internal.h index 9892b7c01..bcce0d68c 100644 --- a/libguile/threads.h +++ b/libguile/threads-internal.h @@ -1,5 +1,5 @@ -#ifndef SCM_THREADS_H -#define SCM_THREADS_H +#ifndef SCM_THREADS_INTERNAL_H +#define SCM_THREADS_INTERNAL_H /* Copyright 1996-1998,2000-2004,2006-2009,2011-2014,2018-2019,2025 Free Software Foundation, Inc. @@ -22,23 +22,11 @@ -#include "libguile/procs.h" -#include "libguile/throw.h" -#include "libguile/dynstack.h" -#include "libguile/iselect.h" -#include "libguile/vm.h" - -#if SCM_USE_PTHREAD_THREADS -#include "libguile/pthread-threads.h" -#endif - -#if SCM_USE_NULL_THREADS -#include "libguile/null-threads.h" -#endif +#include "libguile/fluids-internal.h" +#include "libguile/threads.h" -struct scm_thread_wake_data; struct gc_mutator; struct scm_thread { @@ -76,7 +64,7 @@ struct scm_thread { /* Other thread local things. */ - scm_t_dynamic_state *dynamic_state; + struct scm_dynamic_state dynamic_state; /* The dynamic stack. */ scm_t_dynstack dynstack; @@ -110,24 +98,6 @@ struct scm_thread { struct scm_jit_state *jit_state; }; -static inline SCM -scm_thread_handle (struct scm_thread *thread) -{ - return SCM_PACK_POINTER (thread); -} - -#define SCM_I_IS_THREAD(obj) SCM_HAS_TYP7 ((obj), scm_tc7_thread) -#define SCM_I_THREAD_DATA(x) ((scm_thread *) SCM_UNPACK_POINTER (x)) - -#define SCM_VALIDATE_THREAD(pos, a) \ - SCM_ASSERT_TYPE (SCM_I_IS_THREAD (a), (a), (pos), FUNC_NAME, "thread") - -SCM_API SCM scm_spawn_thread (scm_t_catch_body body, void *body_data, - scm_t_catch_handler handler, void *handler_data); - -SCM_API void *scm_without_guile (void *(*func)(void *), void *data); -SCM_API void *scm_with_guile (void *(*func)(void *), void *data); - SCM_INTERNAL void scm_init_threads (void); SCM_INTERNAL void scm_init_threads_default_dynamic_state (void); @@ -138,83 +108,23 @@ SCM_INTERNAL int scm_i_print_mutex (SCM m, SCM port, scm_print_state *pstate); SCM_INTERNAL int scm_i_print_condition_variable (SCM cv, SCM port, scm_print_state *pstate); -SCM_API SCM scm_call_with_new_thread (SCM thunk, SCM handler); -SCM_API SCM scm_yield (void); -SCM_API SCM scm_cancel_thread (SCM t); -SCM_API SCM scm_join_thread (SCM t); -SCM_API SCM scm_join_thread_timed (SCM t, SCM timeout, SCM timeoutval); -SCM_API SCM scm_thread_p (SCM t); - -SCM_API SCM scm_make_mutex (void); -SCM_API SCM scm_make_recursive_mutex (void); -SCM_API SCM scm_make_mutex_with_kind (SCM kind); -SCM_API SCM scm_lock_mutex (SCM m); -SCM_API SCM scm_timed_lock_mutex (SCM m, SCM timeout); -SCM_API void scm_dynwind_lock_mutex (SCM mutex); -SCM_API SCM scm_try_mutex (SCM m); -SCM_API SCM scm_unlock_mutex (SCM m); -SCM_API SCM scm_mutex_p (SCM o); -SCM_API SCM scm_mutex_locked_p (SCM m); -SCM_API SCM scm_mutex_owner (SCM m); -SCM_API SCM scm_mutex_level (SCM m); - -SCM_API SCM scm_make_condition_variable (void); -SCM_API SCM scm_wait_condition_variable (SCM cond, SCM mutex); -SCM_API SCM scm_timed_wait_condition_variable (SCM cond, SCM mutex, - SCM abstime); -SCM_API SCM scm_signal_condition_variable (SCM cond); -SCM_API SCM scm_broadcast_condition_variable (SCM cond); -SCM_API SCM scm_condition_variable_p (SCM o); - -SCM_API SCM scm_current_thread (void); -SCM_API SCM scm_all_threads (void); - -SCM_API int scm_c_thread_exited_p (SCM thread); -SCM_API SCM scm_thread_exited_p (SCM thread); - -#ifdef BUILDING_LIBGUILE - /* Though we don't need the key for SCM_I_CURRENT_THREAD if we have TLS, we do use it for cleanup purposes. */ SCM_INTERNAL scm_i_pthread_key_t scm_i_thread_key; -# ifdef SCM_HAVE_THREAD_STORAGE_CLASS +#ifdef SCM_HAVE_THREAD_STORAGE_CLASS SCM_INTERNAL SCM_THREAD_LOCAL scm_thread *scm_i_current_thread; -# define SCM_I_CURRENT_THREAD (scm_i_current_thread) +# define SCM_I_CURRENT_THREAD (scm_i_current_thread) -# else /* !SCM_HAVE_THREAD_STORAGE_CLASS */ +#else /* !SCM_HAVE_THREAD_STORAGE_CLASS */ -# define SCM_I_CURRENT_THREAD \ +# define SCM_I_CURRENT_THREAD \ ((scm_thread *) scm_i_pthread_getspecific (scm_i_thread_key)) -# endif /* !SCM_HAVE_THREAD_STORAGE_CLASS */ - -#endif /* BUILDING_LIBGUILE */ +#endif /* !SCM_HAVE_THREAD_STORAGE_CLASS */ SCM_INTERNAL scm_i_pthread_mutex_t scm_i_misc_mutex; -/* Convenience functions for working with the pthread API in guile - mode. -*/ - -#if SCM_USE_PTHREAD_THREADS -SCM_API int scm_pthread_mutex_lock (pthread_mutex_t *mutex); -SCM_API void scm_dynwind_pthread_mutex_lock (pthread_mutex_t *mutex); -SCM_API int scm_pthread_cond_wait (pthread_cond_t *cond, - pthread_mutex_t *mutex); -SCM_API int scm_pthread_cond_timedwait (pthread_cond_t *cond, - pthread_mutex_t *mutex, - const scm_t_timespec *abstime); -#endif - -/* More convenience functions. - */ - -SCM_API unsigned int scm_std_sleep (unsigned int); -SCM_API unsigned long scm_std_usleep (unsigned long); - -SCM_API SCM scm_total_processor_count (void); -SCM_API SCM scm_current_processor_count (void); -#endif /* SCM_THREADS_H */ +#endif /* SCM_THREADS_INTERNAL_H */ diff --git a/libguile/threads.c b/libguile/threads.c index 26e8da43a..56d9758ac 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -69,7 +69,7 @@ #include "vm.h" #include "whippet-embedder.h" -#include "threads.h" +#include "threads-internal.h" @@ -100,8 +100,8 @@ scm_trace_thread (struct scm_thread *thread, trace_edge (gc_edge (&thread->result), heap, trace_data); - /* FIXME: This is not a tagged allocation. */ - trace_edge (gc_edge (&thread->dynamic_state), heap, trace_data); + /* FIXME: Use scm_trace_dynamic_state or so. */ + // trace_edge (gc_edge (&thread->dynamic_state), heap, trace_data); scm_trace_dynstack (&thread->dynstack, trace_edge, heap, trace_data); @@ -468,8 +468,7 @@ guilify_self_2 (SCM dynamic_state) t->continuation_root = scm_cons (scm_thread_handle (t), SCM_EOL); t->continuation_base = t->base; - t->dynamic_state = scm_gc_typed_calloc (scm_t_dynamic_state); - t->dynamic_state->thread_local_values = scm_c_make_hash_table (0); + t->dynamic_state.thread_local_values = scm_c_make_hash_table (0); scm_set_current_dynamic_state (dynamic_state); scm_dynstack_init_for_thread (&t->dynstack); @@ -520,7 +519,6 @@ on_thread_exit (void *v) /* Although this thread has exited, the thread object might still be alive. Release unused memory. */ - t->dynamic_state = NULL; t->dynstack.base = NULL; t->dynstack.top = NULL; t->dynstack.limit = NULL; diff --git a/libguile/threads.h b/libguile/threads.h index 9892b7c01..fe66496aa 100644 --- a/libguile/threads.h +++ b/libguile/threads.h @@ -38,77 +38,8 @@ +struct scm_thread; struct scm_thread_wake_data; -struct gc_mutator; - -struct scm_thread { - scm_t_bits tag; - - struct scm_thread *next_thread; - - /* VM state for this thread. */ - struct scm_vm vm; - - /* For system asyncs. - */ - SCM pending_asyncs; /* The thunks to be run at the next - safe point. Accessed atomically. */ - unsigned int block_asyncs; /* Non-zero means that asyncs should - not be run. */ - - /* Every thread is a mutator for the GC. */ - struct gc_mutator *mutator; - - scm_i_pthread_t pthread; - - SCM result; - int exited; - - /* Boolean indicating whether the thread is in guile mode. */ - int guile_mode; - /* Boolean indicating whether to call GC_unregister_my_thread () when - this thread exits. */ - int needs_unregister; - - struct scm_thread_wake_data *wake; - scm_i_pthread_cond_t sleep_cond; - int sleep_pipe[2]; - - /* Other thread local things. - */ - scm_t_dynamic_state *dynamic_state; - - /* The dynamic stack. */ - scm_t_dynstack dynstack; - - /* The current continuation root and the stack base for it. - - The continuation root is an arbitrary but unique object that - identifies a dynamic extent. Continuations created during that - extent can also only be invoked during it. - - We use pairs where the car is the thread handle and the cdr links - to the previous pair. This might be used for better error - messages but is not essential for identifying continuation roots. - - The continuation base is the far end of the stack upto which it - needs to be copied. - */ - SCM continuation_root; - SCM_STACKITEM *continuation_base; - - /* Stack base. Used when checking for C stack overflow. */ - SCM_STACKITEM *base; - - /* For joinable threads, a cond to wait on joining, and a lock to - protect the results. #f if not joinable. */ - SCM join_cond; - SCM join_lock; - SCM join_results; - - /* JIT state; NULL until this thread needs to JIT-compile something. */ - struct scm_jit_state *jit_state; -}; static inline SCM scm_thread_handle (struct scm_thread *thread) @@ -128,16 +59,6 @@ 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_with_guile (void *(*func)(void *), void *data); -SCM_INTERNAL void scm_init_threads (void); -SCM_INTERNAL void scm_init_threads_default_dynamic_state (void); - -SCM_INTERNAL void scm_i_dynwind_pthread_mutex_lock_block_asyncs (scm_i_pthread_mutex_t *mutex); - -SCM_INTERNAL int scm_i_print_thread (SCM t, SCM port, scm_print_state *pstate); -SCM_INTERNAL int scm_i_print_mutex (SCM m, SCM port, scm_print_state *pstate); -SCM_INTERNAL int scm_i_print_condition_variable (SCM cv, SCM port, - scm_print_state *pstate); - SCM_API SCM scm_call_with_new_thread (SCM thunk, SCM handler); SCM_API SCM scm_yield (void); SCM_API SCM scm_cancel_thread (SCM t); @@ -172,28 +93,6 @@ SCM_API SCM scm_all_threads (void); SCM_API int scm_c_thread_exited_p (SCM thread); SCM_API SCM scm_thread_exited_p (SCM thread); -#ifdef BUILDING_LIBGUILE - -/* Though we don't need the key for SCM_I_CURRENT_THREAD if we have TLS, - we do use it for cleanup purposes. */ -SCM_INTERNAL scm_i_pthread_key_t scm_i_thread_key; - -# ifdef SCM_HAVE_THREAD_STORAGE_CLASS - -SCM_INTERNAL SCM_THREAD_LOCAL scm_thread *scm_i_current_thread; -# define SCM_I_CURRENT_THREAD (scm_i_current_thread) - -# else /* !SCM_HAVE_THREAD_STORAGE_CLASS */ - -# define SCM_I_CURRENT_THREAD \ - ((scm_thread *) scm_i_pthread_getspecific (scm_i_thread_key)) - -# endif /* !SCM_HAVE_THREAD_STORAGE_CLASS */ - -#endif /* BUILDING_LIBGUILE */ - -SCM_INTERNAL scm_i_pthread_mutex_t scm_i_misc_mutex; - /* Convenience functions for working with the pthread API in guile mode. */ diff --git a/libguile/trace.h b/libguile/trace.h index 4275b4996..a7c06d65f 100644 --- a/libguile/trace.h +++ b/libguile/trace.h @@ -1,5 +1,5 @@ -#ifndef SCM_THREADS_INTERNAL_H -#define SCM_THREADS_INTERNAL_H +#ifndef SCM_TRACE_H +#define SCM_TRACE_H /* Copyright 2025 Free Software Foundation, Inc. @@ -96,4 +96,4 @@ scm_trace_dynstack_roots (struct scm_dynstack *dynstack, struct gc_heap *heap, void *trace_data); -#endif /* SCM_THREADS_INTERNAL_H */ +#endif /* SCM_TRACE_H */ diff --git a/libguile/values.c b/libguile/values.c index 4aca740c7..bbe11ee17 100644 --- a/libguile/values.c +++ b/libguile/values.c @@ -27,7 +27,7 @@ #include "list.h" #include "numbers.h" #include "pairs.h" -#include "threads.h" +#include "threads-internal.h" #include "values.h" diff --git a/libguile/variable.c b/libguile/variable.c index cb21e4d30..8d0b10fbc 100644 --- a/libguile/variable.c +++ b/libguile/variable.c @@ -30,7 +30,7 @@ #include "gsubr.h" #include "list.h" #include "ports.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" diff --git a/libguile/vectors.c b/libguile/vectors.c index 5a1480cb8..f8caf0f1e 100644 --- a/libguile/vectors.c +++ b/libguile/vectors.c @@ -35,7 +35,7 @@ #include "list.h" #include "numbers.h" #include "pairs.h" -#include "threads.h" +#include "threads-internal.h" #include "vectors-internal.h" diff --git a/libguile/vports.c b/libguile/vports.c index 909cc5f48..dfbc0609d 100644 --- a/libguile/vports.c +++ b/libguile/vports.c @@ -1,4 +1,4 @@ -/* Copyright 1995-1996,1998-2003,2006,2009-2011,2013,2018,2023 +/* Copyright 1995-1996,1998-2003,2006,2009-2011,2013,2018,2023,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -26,7 +26,7 @@ #include "eval.h" #include "modules.h" -#include "threads.h" +#include "threads-internal.h" #include "variable.h" #include "vports.h"