smp: unshare: UX trap_state and current_interruptable_extent.
authorMatt Birkholz <puck@birchwood-abbey.net>
Tue, 25 Nov 2014 15:46:15 +0000 (08:46 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Sun, 21 Dec 2014 19:19:09 +0000 (12:19 -0700)
Split the thread-local parts out of UX_initialize_trap_recovery into
UX_initialize_trap_state, and those of OS_initialize into
OS_initialize_processor.

src/microcode/intext.c
src/microcode/intext.h
src/microcode/ostop.h
src/microcode/prossmp.c
src/microcode/uxtop.c
src/microcode/uxtrap.c
src/microcode/uxtrap.h

index 2ba8141d700eb8b1cd63e0ed45337690390b73fb..fcbc34a22d0be09a8b0e01c3bf07f175bb221c6b 100644 (file)
@@ -28,7 +28,7 @@ USA.
 
 extern void preserve_signal_mask (void);
 
-struct interruptable_extent * current_interruptable_extent;
+__thread struct interruptable_extent * current_interruptable_extent;
 
 void
 initialize_interruptable_extent (void)
index c10323a9a19b5de383679ac0d53ec4daeee7124e..04e73f36c6645126065dc9e6b464e7be9b613efd 100644 (file)
@@ -36,7 +36,7 @@ struct interruptable_extent
   int interrupted;
 };
 
-extern struct interruptable_extent * current_interruptable_extent;
+extern __thread struct interruptable_extent * current_interruptable_extent;
 extern void initialize_interruptable_extent (void);
 extern void reset_interruptable_extent (void);
 extern struct interruptable_extent * enter_interruptable_extent (void);
index a57d46b6505de47e1e0d55ac44dadc5ac01caccd..be00c6c183a0d04d37eb96952876e49e30b6681f 100644 (file)
@@ -31,6 +31,9 @@ USA.
 
 extern int OS_under_emacs_p (void);
 extern void OS_initialize (void);
+#ifdef ENABLE_SMP
+extern void OS_initialize_processor (void);
+#endif
 extern void OS_reset (void);
 extern void OS_quit (int code, int abnormal_p);
 extern void OS_restartable_exit (void);
index 5cf831fd9a1cdbaf298e817f302ffb73a3cde71f..fe5ee1ee0c62da1485a933a811b95789bc0c96a6 100644 (file)
@@ -31,6 +31,7 @@ USA.
 #ifdef ENABLE_SMP
 
 #include "history.h"
+#include "ostop.h"
 #include "osio.h"
 #include "ossmp.h"
 #include "osproc.h"    /* for OS_process_any_status_change */
@@ -218,6 +219,7 @@ work (void *p)
   assert (self != processors);
   initialize_processor_early ();
   reset_processor_allocator (self);
+  OS_initialize_processor ();
   RESET_HISTORY ();
 
   /* expr: (SMP-PAUSE) */
index be358d23a4ee38432aa4813ba25361b72d7bae3d..e073582cb66b523cdf4ab371c183c1d2e19c8114 100644 (file)
@@ -48,6 +48,7 @@ extern void UX_initialize_environment (void);
 extern void UX_initialize_processes (void);
 extern void UX_initialize_signals (void);
 extern void UX_initialize_terminals (void);
+extern void UX_initialize_trap_state (void);
 extern void UX_initialize_trap_recovery (void);
 extern void UX_initialize_tty (void);
 extern void UX_initialize_userio (void);
@@ -71,9 +72,15 @@ OS_under_emacs_p (void)
 }
 
 void
-OS_initialize (void)
+OS_initialize_processor (void)
 {
   initialize_interruptable_extent ();
+  UX_initialize_trap_state ();
+}
+
+void
+OS_initialize (void)
+{
   {
     interactive =
       (option_force_interactive
@@ -96,6 +103,7 @@ OS_initialize (void)
   UX_initialize_processes ();
   UX_initialize_trap_recovery ();
   UX_initialize_directory_reader ();
+  OS_initialize_processor ();
   OS_Name = SYSTEM_NAME;
   OS_Variant = SYSTEM_VARIANT;
 #if defined(_SUNOS) || defined(_SUNOS3) || defined(_SUNOS4)
index ceef616e7eaa835e2cb635d25dab10640f28f0f4..22a5e05dd0540b3a05d1c04b610402bfb91972e1 100644 (file)
@@ -96,12 +96,12 @@ enum pc_location
 #  define SPECIAL_SIGNAL_CODE_NAMES()
 #endif
 
-static enum trap_state trap_state;
-static enum trap_state user_trap_state;
-static enum trap_state saved_trap_state;
-static int saved_signo;
-static SIGINFO_T saved_info;
-static SIGCONTEXT_T * saved_scp;
+static __thread enum trap_state trap_state;
+static __thread enum trap_state user_trap_state;
+static __thread enum trap_state saved_trap_state;
+static __thread int saved_signo;
+static __thread SIGINFO_T saved_info;
+static __thread SIGCONTEXT_T * saved_scp;
 
 static void continue_from_trap
   (int, SIGINFO_T, SIGCONTEXT_T *);
@@ -136,10 +136,15 @@ static void trap_dump_core (void);
 static void trap_recover (void);
 \f
 void
-UX_initialize_trap_recovery (void)
+UX_initialize_trap_state (void)
 {
   trap_state = trap_state_recover;
   user_trap_state = trap_state_recover;
+}
+
+void
+UX_initialize_trap_recovery (void)
+{
   initialize_ux_signal_codes ();
 }
 
index cd148969a5024afcfba35ec781a541a386414f55..851406c516e7445d908f91b702acfc2cac0dcc3b 100644 (file)
@@ -828,6 +828,7 @@ enum trap_state
 };
 
 extern void UX_initialize_trap_recovery (void);
+extern void UX_initialize_trap_state (void);
 extern enum trap_state OS_set_trap_state (enum trap_state state);
 extern void hard_reset (SIGCONTEXT_T * scp);
 extern void soft_reset (void);