Skip to content
  • Andy Wingo's avatar
    Add thread local fluids · fb8c91a3
    Andy Wingo authored
    * libguile/fluids.h (struct scm_dynamic_state): Add thread_local_values
      table.  Thread locals are flushed to a separate thread-local table.
      The references are strong references since the table never escapes the
      thread.
      (scm_make_thread_local_fluid, scm_fluid_thread_local_p): New
      functions.
    * libguile/fluids.c (FLUID_F_THREAD_LOCAL):
      (SCM_I_FLUID_THREAD_LOCAL_P): New macros.
      (restore_dynamic_state): Add comment about precondition.
      (save_dynamic_state): Flush thread locals.
      (scm_i_fluid_print): Print thread locals nicely.
      (new_fluid): Add flags arg.
      (scm_make_fluid, scm_make_fluid_with_default, scm_make_unbound_fluid):
      Adapt.
      (scm_make_thread_local_fluid, scm_fluid_thread_local_p): New
      functions.
      (fluid_set_x): Special flushing logic for thread-locals.
      (fluid_ref): Special cache miss logic for thread locals.
    * libguile/stacks.c (scm_init_stacks):
    * libguile/throw.c (scm_init_throw): %stacks and %exception-handler are
      thread-locals.
    * libguile/threads.c (guilify_self_2): Init thread locals table.
    * test-suite/tests/fluids.test ("dynamic states"): Add test.
    * doc/ref/api-control.texi (Fluids and Dynamic States): Add link to
      Thread-Local Variables.
    * doc/ref/api-scheduling.texi (Thread Local Variables): Update with real
      thread-locals.
    * NEWS: Update.
    fb8c91a3