Initialize thread-local compiler_utilities.
authorMatt Birkholz <puck@birchwood-abbey.net>
Sun, 19 Jul 2015 05:47:38 +0000 (22:47 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Thu, 26 Nov 2015 08:09:46 +0000 (01:09 -0700)
Split the thread-local parts of compiler_initialize into
compiler_initialize_processor, those of compiler_reset into
compiler_reset_processor.  Split the non-thread-local parts of
ASM_RESET_HOOK into ASM_INIT_HOOK.  Call the _processor versions in
co-processor startup and after GC waits (when necessary).

Add compiler_reset_p flag to processor_t so that load-band
(compiler_reset) can notify the other processors to load the new
compiler_utilities into their Registers slots.

src/microcode/cmpint.c
src/microcode/cmpint.h
src/microcode/ossmp.h
src/microcode/prossmp.c

index 90a91092287fc808dcc7e1ba6c20ec1c6f734621..1c06ce384329381f8a7046cc49f3bdd6474659a3 100644 (file)
@@ -254,6 +254,9 @@ long C_return_value;
   SCHEME_OBJECT Registers [REGBLOCK_LENGTH];
 #endif
 
+#ifndef ASM_INIT_HOOK
+#  define ASM_INIT_HOOK() do {} while (false)
+#endif
 #ifndef ASM_RESET_HOOK
 #  define ASM_RESET_HOOK() do {} while (false)
 #endif
@@ -287,6 +290,13 @@ long C_return_value;
 \f
 /* Initialization */
 
+void
+compiler_initialize_processor (void)
+{
+  assert (compiler_utilities != SHARP_F);
+  compiler_reset_processor ();
+}
+
 void
 compiler_initialize (bool fasl_p)
 {
@@ -356,6 +366,17 @@ make_compiler_utilities (void)
   return (MAKE_CC_BLOCK (block));
 }
 
+void
+compiler_reset_processor (void)
+{
+  SET_PRIMITIVE (SHARP_F);
+  SET_CLOSURE_FREE (0);
+  SET_CLOSURE_SPACE (0);
+  SET_REFLECTOR (reflect_to_interface);
+
+  ASM_RESET_HOOK ();
+}
+
 void
 compiler_reset (SCHEME_OBJECT new_block)
 {
@@ -381,11 +402,20 @@ compiler_reset (SCHEME_OBJECT new_block)
   compiler_utilities = new_block;
   return_to_interpreter = (MAKE_CC_ENTRY (trampoline_entry_addr (nbp, 0)));
   reflect_to_interface = (MAKE_CC_ENTRY (trampoline_entry_addr (nbp, 1)));
-  SET_CLOSURE_FREE (0);
-  SET_CLOSURE_SPACE (0);
-  SET_REFLECTOR (reflect_to_interface);
 
-  ASM_RESET_HOOK ();
+  ASM_INIT_HOOK ();
+
+  compiler_reset_processor ();
+#ifdef ENABLE_SMP
+  {
+    processor_t *p;
+    for (p = processors; p != NULL; p = p->next)
+      {
+       if (p != self)
+         p->compiler_reset_p = true;
+      }
+  }
+#endif
 }
 \f
 /* Main compiled-code entry points */
index adac7a7b839b87a03ccbdab691a1ae5ba1cdcca5..a7c540b03c773f83fe464bcf5d5f38376514ec2f 100644 (file)
@@ -417,7 +417,9 @@ extern void compiled_with_interrupt_mask
 extern void compiled_with_stack_marker (SCHEME_OBJECT);
 
 extern void compiler_initialize (bool);
+extern void compiler_initialize_processor (void);
 extern void compiler_reset (SCHEME_OBJECT);
+extern void compiler_reset_processor (void);
 
 extern void declare_compiled_code_block (SCHEME_OBJECT);
 
index 7f074a2771559996f97415d8b3f2629c290a0247..5471575cb2d903b265d2eec38a074211ebc87d3b 100644 (file)
@@ -44,6 +44,8 @@ typedef struct processor processor_t;
 struct processor {
   struct processor *next;
   char id;
+  /* Set by compiler_reset (load-band) when there are new compiler utilities. */
+  bool compiler_reset_p;
   processor_state_t state;
   pthread_t pthread;
   SCHEME_OBJECT * stack_end;
index c65a08cf4fc4792d06554ac1efc06da9e5049922..7725410c22db21e62fc1a66d52d6332abe3ba317 100644 (file)
@@ -256,6 +256,7 @@ make_processors (int id)
                                     + id * saved_processor_heap_size);
   new->next = processors;
   new->id = id;
+  new->compiler_reset_p = false;
   new->state = PROCESSOR_NEW;
   new->stack_start = stack_start;
   new->stack_end = stack_start + saved_stack_size;
@@ -332,6 +333,12 @@ gc_wait (void)
   cond_wait (&finished, &state_mutex);
   trace (";%d GC wait finished.", self->id);
 
+  if (self->compiler_reset_p)
+    {
+      compiler_reset_processor ();
+      self->compiler_reset_p = false;
+    }
+
   assert (self->state == PROCESSOR_RUNNING);
 }
 
@@ -468,6 +475,8 @@ Pause a new processor.")
         for band-load. */
     }
 
+  compiler_initialize_processor ();
+
  Will_Push (STACK_ENV_EXTRA_SLOTS + 1);
   STACK_PUSH (get_smp_idle_prim ());
   PUSH_APPLY_FRAME_HEADER (0);