#ifdef ECL_THREADS
cl_core.last_var_index = 0;
cl_core.reused_indices = Cnil;
- env->bindings_hash = si_make_vector(Ct, MAKE_FIXNUM(256),
+ env->bindings_array = si_make_vector(Ct, MAKE_FIXNUM(256),
Cnil, Cnil, Cnil, Cnil);
- si_fill_array_with_elt(env->bindings_hash, OBJNULL, MAKE_FIXNUM(0), Cnil);
+ si_fill_array_with_elt(env->bindings_array, OBJNULL, MAKE_FIXNUM(0), Cnil);
+ env->thread_local_bindings_size = env->bindings_array->vector.dim;
+ env->thread_local_bindings = env->bindings_array->vector.self.t;
ECL_SET(@'mp::*current-process*', env->own_process);
#endif
return ecl_new_binding_index(s);
} else {
cl_env_ptr env = ecl_process_env();
- cl_object vector = env->bindings_hash;
- env->bindings_hash = ecl_extend_bindings_array(vector);
+ cl_object vector = env->bindings_array;
+ env->bindings_array = ecl_extend_bindings_array(vector);
+ env->thread_local_bindings_size = vector->vector.dim;
+ env->thread_local_bindings = vector->vector.self.t;
return s->symbol.binding;
}
}
struct bds_bd *slot;
cl_index index = s->symbol.binding;
AGAIN:
- bindings = env->bindings_hash;
- if (index >= bindings->vector.dim) {
+ if (index >= env->thread_local_bindings_size) {
index = ecl_bds_bind_special_case(s);
goto AGAIN;
}
- location = bindings->array.self.t + index;
+ location = env->thread_local_bindings + index;
slot = ++env->bds_top;
if (slot >= env->bds_limit) {
ecl_bds_overflow();
struct bds_bd *slot;
cl_index index = s->symbol.binding;
AGAIN:
- bindings = env->bindings_hash;
- if (index >= bindings->vector.dim) {
+ if (index >= env->thread_local_bindings_size) {
index = ecl_bds_bind_special_case(s);
goto AGAIN;
}
- location = bindings->array.self.t + index;
+ location = env->thread_local_bindings + index;
slot = ++env->bds_top;
if (slot >= env->bds_limit) {
ecl_bds_overflow();
{
struct bds_bd *slot = env->bds_top--;
cl_object s = slot->symbol;
- cl_object bindings = env->bindings_hash;
- cl_object *location = bindings->vector.self.t + s->symbol.binding;
+ cl_object *location = env->thread_local_bindings + s->symbol.binding;
*location = slot->value;
}
s = Cnil_symbol;
} else {
cl_index index = s->symbol.binding;
- cl_object bindings = env->bindings_hash;
- if (index < bindings->vector.dim) {
- cl_object *location = bindings->vector.self.t + index;
+ if (index < env->thread_local_bindings_size) {
+ cl_object *location = env->thread_local_bindings + index;
if (*location)
return location;
}
ecl_set_symbol(cl_env_ptr env, cl_object s, cl_object value)
{
cl_index index = s->symbol.binding;
- cl_object bindings = env->bindings_hash;
- if (index < bindings->vector.dim) {
- cl_object *location = bindings->vector.self.t + index;
+ if (index < env->thread_local_bindings_size) {
+ cl_object *location = env->thread_local_bindings + index;
if (*location)
return (*location) = value;
}
Cnil, Cnil, Cnil, Cnil);
si_fill_array_with_elt(array, OBJNULL, MAKE_FIXNUM(0), Cnil);
} else {
- array = cl_copy_seq(ecl_process_env()->bindings_hash);
+ array = cl_copy_seq(ecl_process_env()->bindings_array);
}
process->process.initial_bindings = array;
process->process.exit_lock = mp_make_lock(0);
cl_core.processes = CONS(process, cl_core.processes);
THREAD_OP_UNLOCK();
ecl_init_env(env);
- env->bindings_hash = process->process.initial_bindings;
+ env->bindings_array = process->process.initial_bindings;
+ env->thread_local_bindings_size = env->bindings_array->vector.dim;
+ env->thread_local_bindings = env->bindings_array->vector.self.t;
mp_get_lock_wait(process->process.exit_lock);
process->process.active = 1;
ecl_enable_interrupts_env(env);
process_env = _ecl_alloc_env();
ecl_init_env(process_env);
process_env->trap_fpe_bits = process->process.trap_fpe_bits;
- process_env->bindings_hash = process->process.initial_bindings;
+ process_env->bindings_array = process->process.initial_bindings;
+ process_env->thread_local_bindings_size =
+ process_env->bindings_array->vector.dim;
+ process_env->thread_local_bindings =
+ process_env->bindings_array->vector.self.t;
process_env->own_process = process;
process->process.env = process_env;
/*
* The BinDing Stack stores the bindings of special variables.
*/
+#ifdef ECL_THREADS
+ cl_index thread_local_bindings_size;
+ cl_object *thread_local_bindings;
+ cl_object bindings_array;
+#endif
cl_index bds_size;
struct bds_bd *bds_org;
struct bds_bd *bds_top;
struct bds_bd *bds_limit;
-#ifdef ECL_THREADS
- cl_object bindings_hash;
-#endif
/*
* The Invocation History Stack (IHS) keeps a list of the names of the