Another variant in which the memory address of the bindings and their size is stored...
authorJuan Jose Garcia Ripoll <jjgarcia@jjgr-2.local>
Fri, 22 Jan 2010 18:07:18 +0000 (19:07 +0100)
committerJuan Jose Garcia Ripoll <jjgarcia@jjgr-2.local>
Fri, 22 Jan 2010 18:07:18 +0000 (19:07 +0100)
src/c/main.d
src/c/stacks.d
src/c/threads.d
src/h/external.h

index d812678..75b467b 100644 (file)
@@ -545,9 +545,11 @@ cl_boot(int argc, char **argv)
 #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
 
index 6889795..87df451 100644 (file)
@@ -148,8 +148,10 @@ ecl_bds_bind_special_case(cl_object s)
                 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;
         }
 }
@@ -161,12 +163,11 @@ ecl_bds_bind(cl_env_ptr env, cl_object s, cl_object value)
         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();
@@ -184,12 +185,11 @@ ecl_bds_push(cl_env_ptr env, cl_object s)
         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();
@@ -205,8 +205,7 @@ ecl_bds_unwind1(cl_env_ptr env)
 {
        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;
 }
 
@@ -217,9 +216,8 @@ ecl_symbol_slot(cl_env_ptr env, cl_object s)
                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;
                 }
@@ -231,9 +229,8 @@ cl_object
 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;
         }
index c2eb08e..77b6340 100644 (file)
@@ -216,7 +216,7 @@ alloc_process(cl_object name, cl_object initial_bindings)
                                        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);
@@ -263,7 +263,9 @@ ecl_import_current_thread(cl_object name, cl_object bindings)
        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);
@@ -384,7 +386,11 @@ mp_process_enable(cl_object process)
        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;
index 42edc62..78aa248 100644 (file)
@@ -35,13 +35,15 @@ struct cl_env_struct {
        /*
         * 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