diff options
author | Andy Wingo <wingo@pobox.com> | 2011-05-06 00:17:35 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2011-05-06 00:17:35 +0200 |
commit | a2a6c0e319b5c146c484cb1fe8ffc9b14b9a9876 (patch) | |
tree | daec4c1b9cc5f45b0fe6d3330db1657143bff86a | |
parent | a2230b653b86cece1daab09315873b5a4c592d6b (diff) | |
download | guile-a2a6c0e319b5c146c484cb1fe8ffc9b14b9a9876.tar.gz |
avoid tls gets when handling interrupts in the vm
* libguile/__scm.h (SCM_ASYNC_TICK_WITH_CODE): Redefine to take a
scm_i_thread* as well. OK to do because it's within a
BUILDING_LIBGUILE block.
* libguile/vm-engine.c (vm_engine): Cache the scm_i_thread* instead of
the dynstate, so we can use the thread for ticks.
* libguile/vm-engine.h (VM_HANDLE_INTERRUPTS): Tick with the
scm_i_thread* local var, to avoid excessive tls calls.
* libguile/vm-i-system.c: Fix dynstate users to use
current_thread->dynamic_state.
-rw-r--r-- | libguile/__scm.h | 4 | ||||
-rw-r--r-- | libguile/vm-engine.c | 2 | ||||
-rw-r--r-- | libguile/vm-engine.h | 2 | ||||
-rw-r--r-- | libguile/vm-i-system.c | 8 |
4 files changed, 8 insertions, 8 deletions
diff --git a/libguile/__scm.h b/libguile/__scm.h index 2bfb4f694..f5551ad7a 100644 --- a/libguile/__scm.h +++ b/libguile/__scm.h @@ -536,10 +536,10 @@ SCM_API void scm_async_tick (void); while (0) /* SCM_ASYNC_TICK_WITH_CODE is only available to Guile itself */ -# define SCM_ASYNC_TICK_WITH_CODE(stmt) \ +# define SCM_ASYNC_TICK_WITH_CODE(thr, stmt) \ do \ { \ - if (SCM_UNLIKELY (SCM_I_CURRENT_THREAD->pending_asyncs)) \ + if (SCM_UNLIKELY (thr->pending_asyncs)) \ { \ stmt; \ scm_async_click (); \ diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index bfa848967..e449b4372 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -52,7 +52,7 @@ VM_NAME (SCM vm, SCM program, SCM *argv, int nargs) #endif SCM *stack_limit = vp->stack_limit; /* stack limit address */ - SCM dynstate = SCM_I_CURRENT_THREAD->dynamic_state; + scm_i_thread *current_thread = SCM_I_CURRENT_THREAD; scm_t_int64 vm_cookie = vp->cookie++; /* Internal variables */ diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h index abbc11077..146931eb6 100644 --- a/libguile/vm-engine.h +++ b/libguile/vm-engine.h @@ -244,7 +244,7 @@ RUN_HOOK (SCM_VM_RESTORE_CONTINUATION_HOOK) #define VM_HANDLE_INTERRUPTS \ - SCM_ASYNC_TICK_WITH_CODE (SYNC_REGISTER ()) + SCM_ASYNC_TICK_WITH_CODE (current_thread, SYNC_REGISTER ()) /* diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index ea00fc920..0ff411f9a 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -1635,7 +1635,7 @@ VM_DEFINE_INSTRUCTION (89, wind_fluids, "wind-fluids", 1, -1, 0) wf = scm_i_make_with_fluids (n, sp + 1, sp + 1 + n); NULLSTACK (2 * n); - scm_i_swap_with_fluids (wf, dynstate); + scm_i_swap_with_fluids (wf, current_thread->dynamic_state); scm_i_set_dynwinds (scm_cons (wf, scm_i_dynwinds ())); NEXT; } @@ -1645,7 +1645,7 @@ VM_DEFINE_INSTRUCTION (90, unwind_fluids, "unwind-fluids", 0, 0, 0) SCM wf; wf = scm_car (scm_i_dynwinds ()); scm_i_set_dynwinds (scm_cdr (scm_i_dynwinds ())); - scm_i_swap_with_fluids (wf, dynstate); + scm_i_swap_with_fluids (wf, current_thread->dynamic_state); NEXT; } @@ -1655,7 +1655,7 @@ VM_DEFINE_INSTRUCTION (91, fluid_ref, "fluid-ref", 0, 1, 1) SCM fluids; CHECK_UNDERFLOW (); - fluids = SCM_I_DYNAMIC_STATE_FLUIDS (dynstate); + fluids = SCM_I_DYNAMIC_STATE_FLUIDS (current_thread->dynamic_state); if (SCM_UNLIKELY (!SCM_FLUID_P (*sp)) || ((num = SCM_I_FLUID_NUM (*sp)) >= SCM_SIMPLE_VECTOR_LENGTH (fluids))) { @@ -1683,7 +1683,7 @@ VM_DEFINE_INSTRUCTION (92, fluid_set, "fluid-set", 0, 2, 0) SCM val, fluid, fluids; POP2 (val, fluid); - fluids = SCM_I_DYNAMIC_STATE_FLUIDS (dynstate); + fluids = SCM_I_DYNAMIC_STATE_FLUIDS (current_thread->dynamic_state); if (SCM_UNLIKELY (!SCM_FLUID_P (fluid)) || ((num = SCM_I_FLUID_NUM (fluid)) >= SCM_SIMPLE_VECTOR_LENGTH (fluids))) { |