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"

Reply via email to