Make trap_state and current_interruptable_extent thread-local.
authorMatt Birkholz <puck@birchwood-abbey.net>
Tue, 21 Jul 2015 09:11:12 +0000 (02:11 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Thu, 26 Nov 2015 08:09:45 +0000 (01:09 -0700)
Split the thread-local parts of UX_initialize_trap_recovery into
UX_initialize_trap_state, and those of OS_initialize into
OS_initialize_processor.  Call the latter in OS_initialize and the
co-processors' work function.

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 95d9b809a73a60aec7f69db9a0eabc2d93dc1390..152efbc016b89380fbfb5cb5532a20fdbf9bcd0f 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 efa675bf00e7b95acfa002779c3b7cf9146b2fcf..d2c5c64511f7d81278d943e6b479cf91cb0919b1 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 4cf99044c811b8f8aa935644505ce00f3166b4c1..aac3c73ab9ed13cc7909bb95f8e75d9b5c76f8c2 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 c0dc5cf10a49bb92a1ceb807b95524f6d01cd99a..c65a08cf4fc4792d06554ac1efc06da9e5049922 100644 (file)
@@ -31,6 +31,7 @@ USA.
 #ifdef ENABLE_SMP
 
 #include "history.h"
+#include "ostop.h"
 #include "osio.h"
 #include <errno.h>
 
@@ -205,6 +206,7 @@ work (void *p)
   assert (self != processors);
   initialize_processor_early ();
   reset_processor_allocator (self);
+  OS_initialize_processor ();
   RESET_HISTORY ();
 
   /* expr: (SMP-PAUSE) */
index 405835bb53aa4e25c6541ba947177a7cb825279d..29014d485917a6e4720b033def225003de453d0d 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 aaf52b4d8ce7828252263003f4c5436f605930bb..f6c7e5bd3984121e6092187ac585f2ca2aadebd8 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 90c383b00eb5708823e670df465577ef14d302fd..c33cff3d856cde84378f6e355f01b70ff466f36f 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);