smp: unshare: interpreter_state, dstack, current_transaction...
authorMatt Birkholz <puck@birchwood-abbey.net>
Tue, 25 Nov 2014 15:07:19 +0000 (08:07 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Sun, 21 Dec 2014 19:19:09 +0000 (12:19 -0700)
...scheme_fenv, scheme_fenv_p, dstack_position,
current_winding_record, interpreter_state, prim_apply_error_code,
critical_section_hook, critical_section_hook_p, critical_section_name.

Pulled initializations into a new initialize_processor_early function
and used it in both main and the co-processors' work.

src/microcode/boot.c
src/microcode/critsec.h
src/microcode/dstack.h
src/microcode/extern.h
src/microcode/floenv.c
src/microcode/interp.c
src/microcode/interp.h
src/microcode/prossmp.c
src/microcode/transact.c
src/microcode/wind.c

index 555d90fe38f41337a215438f00563d55af3dea64..21f50c76f1c5e4263a38e41f0bbe74fb51d642c9 100644 (file)
@@ -54,15 +54,16 @@ extern SCHEME_OBJECT make_microcode_identification_vector (void);
 #  define HOOK_ENTER_INTERPRETER(func) func ()
 #endif
 \f
+extern void initialize_processor_early (void);
 static void start_scheme (void);
 static void Enter_Interpreter (void);
 
 const char * scheme_program_name;
 const char * OS_Name;
 const char * OS_Variant;
-struct obstack scratch_obstack;
-struct obstack ffi_obstack;
-void * initial_C_stack_pointer;
+__thread struct obstack scratch_obstack;
+__thread struct obstack ffi_obstack;
+static void * initial_C_stack_pointer;
 static char * reload_saved_string;
 static unsigned int reload_saved_string_length;
 
@@ -108,10 +109,8 @@ main_name (int argc, const char ** argv)
 #ifdef __OS2__
   OS2_initialize_early ();
 #endif
-  obstack_init (&scratch_obstack);
-  obstack_init (&ffi_obstack);
-  dstack_initialize ();
-  transaction_initialize ();
+  initialize_processor_early ();
+
   reload_saved_string = 0;
   reload_saved_string_length = 0;
   read_command_line_options (argc, argv);
@@ -139,6 +138,15 @@ main_name (int argc, const char ** argv)
   termination_init_error ();
   return (0);
 }
+
+void
+initialize_processor_early (void)
+{
+  obstack_init (&scratch_obstack);
+  obstack_init (&ffi_obstack);
+  dstack_initialize ();
+  transaction_initialize ();
+}
 \f
 /* Boot Scheme */
 
index fa2b817d516cecdda04f72e99db4ef833117ccb5..b21ea0f20c469462cd4e370b40ed47df8a25fb48 100644 (file)
@@ -31,14 +31,14 @@ USA.
 #ifndef SCM_CRITSEC_H
 #define SCM_CRITSEC_H 1
 
-extern const char * critical_section_name;
-extern bool critical_section_hook_p;
-extern void (*critical_section_hook) (const char *);
+extern __thread const char * critical_section_name;
+extern __thread bool critical_section_hook_p;
+extern __thread void (*critical_section_hook) (const char *);
 
 #define DECLARE_CRITICAL_SECTION()                                     \
-  const char * critical_section_name = 0;                              \
-  bool critical_section_hook_p;                                                \
-  void (*critical_section_hook) (const char *)
+  __thread const char * critical_section_name = 0;                     \
+  __thread bool critical_section_hook_p;                               \
+  __thread void (*critical_section_hook) (const char *)
 
 #define ENTER_CRITICAL_SECTION(name) critical_section_name = (name)
 #define RENAME_CRITICAL_SECTION(name) critical_section_name = (name)
index 319b0f2ffe908fd1f645509a13b16e062a02cfcf..24f12edd9439c6f4ed1f44dc30b340650512c655 100644 (file)
@@ -54,7 +54,7 @@ extern void dstack_alloc_and_protect
    initialize that space, and create an unwind protection frame that
    invokes `protector' when the stack is unwound.  */
 
-extern void * dstack_position;
+extern __thread void * dstack_position;
 /* The current stack pointer. */
 
 extern void dstack_set_position (void * position);
index 4b14358656f64710ac2f52d5e347a3cfe8f0d1a7..3df6fd8b849ac959cde8fefcdb55dd1fe1839f45 100644 (file)
@@ -187,8 +187,8 @@ extern __thread bool trapping;
 extern const char * scheme_program_name;
 extern const char * OS_Name;
 extern const char * OS_Variant;
-extern struct obstack scratch_obstack;
-extern struct obstack ffi_obstack;
+extern __thread struct obstack scratch_obstack;
+extern __thread struct obstack ffi_obstack;
 
 extern SCHEME_OBJECT * memory_block_start;
 extern SCHEME_OBJECT * memory_block_end;
index 4bc0077292eea8bfd6c009798d2c8c486e5bff8e..207986c076ca546fac2b2e35c325fdcb0d15c2a2 100644 (file)
@@ -56,8 +56,8 @@ typedef char fenv_t;
 typedef char fexcept_t;
 #endif
 \f
-static bool scheme_fenv_p = false;
-static fenv_t scheme_fenv;
+static __thread bool scheme_fenv_p = false;
+static __thread fenv_t scheme_fenv;
 
 static void
 cache_float_environment (void)
index 057ce4a91e2f6a15d0eaa25f180e3dca6df33302..8aece778ff293dd8a55b29975997ba18e6cd7246 100644 (file)
@@ -196,7 +196,7 @@ extern void fixup_float_environment (void);
 \f
 /* The EVAL/APPLY yin/yang */
 
-interpreter_state_t interpreter_state = NULL_INTERPRETER_STATE;
+__thread interpreter_state_t interpreter_state = NULL_INTERPRETER_STATE;
 
 void
 bind_interpreter_state (interpreter_state_t s)
@@ -250,7 +250,7 @@ abort_to_interpreter_argument (void)
   return (interpreter_throw_argument);
 }
 
-long prim_apply_error_code;
+__thread long prim_apply_error_code;
 \f
 void
 Interpret (int pop_return_p)
index 3600e6dbd5ffdb311d8ac8cad4ecae4e813b9225..283ad0045ac835930c4d9b7c04c8e6cf1af168ed 100644 (file)
@@ -155,8 +155,8 @@ struct interpreter_state_s
 extern void abort_to_interpreter (int) NORETURN;
 extern int abort_to_interpreter_argument (void);
 
-extern interpreter_state_t interpreter_state;
-extern long prim_apply_error_code;
+extern __thread interpreter_state_t interpreter_state;
+extern __thread long prim_apply_error_code;
 extern void bind_interpreter_state (interpreter_state_t);
 extern void unbind_interpreter_state (interpreter_state_t);
 
index 1f99d547dff878c3432be374b2bc287b114cdd8c..5cf831fd9a1cdbaf298e817f302ffb73a3cde71f 100644 (file)
@@ -206,6 +206,8 @@ setup_processors (int count)
   RESET_HISTORY ();
 }
 
+extern void initialize_processor_early (void);
+
 static void *
 work (void *p)
 {
@@ -214,6 +216,7 @@ work (void *p)
   trace (";%d Start.", self->id);
   assert (self->id != 0);
   assert (self != processors);
+  initialize_processor_early ();
   reset_processor_allocator (self);
   RESET_HISTORY ();
 
index 4afbd6a054437632ba1295d2bc2c214723810285..c3ab6695ca245d492068a127cae53b305622a48a 100644 (file)
@@ -46,7 +46,7 @@ struct transaction
   enum transaction_state state;
 };
 
-static struct transaction * current_transaction;
+static __thread struct transaction * current_transaction;
 
 static void
 guarantee_current_transaction (const char * proc)
index 65c383bbf1c9bbaa2f531fb461788ef6b101d95b..33f29ad12ac43d8cef5e6a2b55ef45f379a6f77d 100644 (file)
@@ -52,9 +52,9 @@ struct winding_record
   void * environment;
 };
 
-static struct obstack dstack;
-static struct winding_record * current_winding_record;
-void * dstack_position;
+static __thread struct obstack dstack;
+static __thread struct winding_record * current_winding_record;
+__thread void * dstack_position;
 
 void
 dstack_initialize (void)