Alexandre Julliard : ntdll: Add a helper for platform-specific threading initialization.

Alexandre Julliard julliard at winehq.org
Tue Apr 28 16:32:21 CDT 2020


Module: wine
Branch: master
Commit: ffb7c595c6c1cf0d6760a6394a6a634afe38b378
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ffb7c595c6c1cf0d6760a6394a6a634afe38b378

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Apr 28 13:17:07 2020 +0200

ntdll: Add a helper for platform-specific threading initialization.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/ntdll_misc.h     |  1 +
 dlls/ntdll/signal_arm.c     | 17 +++++++++--------
 dlls/ntdll/signal_arm64.c   | 16 +++++++++-------
 dlls/ntdll/signal_i386.c    | 43 +++++++++++++++++++++++--------------------
 dlls/ntdll/signal_powerpc.c | 16 +++++++++-------
 dlls/ntdll/signal_x86_64.c  |  8 ++++++++
 dlls/ntdll/thread.c         |  1 +
 7 files changed, 60 insertions(+), 42 deletions(-)

diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index 1c3088ae40..55de8dbce8 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -77,6 +77,7 @@ extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN;
 extern LPCSTR debugstr_ObjectAttributes(const OBJECT_ATTRIBUTES *oa) DECLSPEC_HIDDEN;
 
 /* init routines */
+extern void signal_init_threading(void) DECLSPEC_HIDDEN;
 extern NTSTATUS signal_alloc_thread( TEB **teb ) DECLSPEC_HIDDEN;
 extern void signal_free_thread( TEB *teb ) DECLSPEC_HIDDEN;
 extern void signal_init_thread( TEB *teb ) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index 63c008224d..5935f5f8d9 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -952,6 +952,15 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
 }
 
 
+/**********************************************************************
+ *             signal_init_threading
+ */
+void signal_init_threading(void)
+{
+    pthread_key_create( &teb_key, NULL );
+}
+
+
 /**********************************************************************
  *             signal_alloc_thread
  */
@@ -997,14 +1006,6 @@ void signal_free_thread( TEB *teb )
  */
 void signal_init_thread( TEB *teb )
 {
-    static BOOL init_done;
-
-    if (!init_done)
-    {
-        pthread_key_create( &teb_key, NULL );
-        init_done = TRUE;
-    }
-
 #if defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_8A__)
     /* Win32/ARM applications expect the TEB pointer to be in the TPIDRURW register. */
     __asm__ __volatile__( "mcr p15, 0, %0, c13, c0, 2" : : "r" (teb) );
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 15e78dbb56..2c61d8a774 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -1250,6 +1250,15 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
 }
 
 
+/**********************************************************************
+ *             signal_init_threading
+ */
+void signal_init_threading(void)
+{
+    pthread_key_create( &teb_key, NULL );
+}
+
+
 /**********************************************************************
  *             signal_alloc_thread
  */
@@ -1286,15 +1295,8 @@ void signal_free_thread( TEB *teb )
  */
 void signal_init_thread( TEB *teb )
 {
-    static BOOL init_done;
     stack_t ss;
 
-    if (!init_done)
-    {
-        pthread_key_create( &teb_key, NULL );
-        init_done = TRUE;
-    }
-
     ss.ss_sp    = (char *)teb + teb_size;
     ss.ss_size  = signal_stack_size;
     ss.ss_flags = 0;
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index c953d18a65..f7cdbd606e 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -2438,25 +2438,6 @@ static void ldt_set_entry( WORD sel, LDT_ENTRY entry )
                                     LDT_FLAGS_ALLOCATED);
 }
 
-static void ldt_init(void)
-{
-#ifdef __linux__
-    /* the preloader may have allocated it already */
-    gdt_fs_sel = get_fs();
-    if (!gdt_fs_sel || !is_gdt_sel( gdt_fs_sel ))
-    {
-        struct modify_ldt_s ldt_info = { -1 };
-
-        ldt_info.seg_32bit = 1;
-        ldt_info.usable = 1;
-        if (set_thread_area( &ldt_info ) >= 0) gdt_fs_sel = (ldt_info.entry_number << 3) | 3;
-        else gdt_fs_sel = 0;
-    }
-#elif defined(__FreeBSD__) || defined (__FreeBSD_kernel__)
-    gdt_fs_sel = GSEL( GUFS_SEL, SEL_UPL );
-#endif
-}
-
 WORD ldt_alloc_fs( TEB *teb, int first_thread )
 {
     LDT_ENTRY entry;
@@ -2583,6 +2564,29 @@ NTSTATUS WINAPI NtSetLdtEntries( ULONG sel1, LDT_ENTRY entry1, ULONG sel2, LDT_E
 }
 
 
+/**********************************************************************
+ *             signal_init_threading
+ */
+void signal_init_threading(void)
+{
+#ifdef __linux__
+    /* the preloader may have allocated it already */
+    gdt_fs_sel = get_fs();
+    if (!gdt_fs_sel || !is_gdt_sel( gdt_fs_sel ))
+    {
+        struct modify_ldt_s ldt_info = { -1 };
+
+        ldt_info.seg_32bit = 1;
+        ldt_info.usable = 1;
+        if (set_thread_area( &ldt_info ) >= 0) gdt_fs_sel = (ldt_info.entry_number << 3) | 3;
+        else gdt_fs_sel = 0;
+    }
+#elif defined(__FreeBSD__) || defined (__FreeBSD_kernel__)
+    gdt_fs_sel = GSEL( GUFS_SEL, SEL_UPL );
+#endif
+}
+
+
 /**********************************************************************
  *		signal_alloc_thread
  */
@@ -2603,7 +2607,6 @@ NTSTATUS signal_alloc_thread( TEB **teb )
         while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
         signal_stack_mask = (1 << sigstack_alignment) - 1;
         signal_stack_size = (1 << sigstack_alignment) - teb_size;
-        ldt_init();
     }
 
     size = signal_stack_mask + 1;
diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c
index ee765e226b..0ef71af351 100644
--- a/dlls/ntdll/signal_powerpc.c
+++ b/dlls/ntdll/signal_powerpc.c
@@ -1013,6 +1013,15 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
 }
 
 
+/**********************************************************************
+ *             signal_init_threading
+ */
+void signal_init_threading(void)
+{
+    pthread_key_create( &teb_key, NULL );
+}
+
+
 /**********************************************************************
  *		signal_alloc_thread
  */
@@ -1058,13 +1067,6 @@ void signal_free_thread( TEB *teb )
  */
 void signal_init_thread( TEB *teb )
 {
-    static BOOL init_done;
-
-    if (!init_done)
-    {
-        pthread_key_create( &teb_key, NULL );
-        init_done = TRUE;
-    }
     pthread_setspecific( teb_key, teb );
 }
 
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 2f9c3dae22..b53edf7633 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -3107,6 +3107,14 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
 }
 
 
+/**********************************************************************
+ *             signal_init_threading
+ */
+void signal_init_threading(void)
+{
+}
+
+
 /**********************************************************************
  *		signal_alloc_thread
  */
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 73b5c9ebca..7353c86899 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -284,6 +284,7 @@ TEB *thread_init(void)
 
     /* allocate and initialize the initial TEB */
 
+    signal_init_threading();
     signal_alloc_thread( &teb );
     teb->Peb = peb;
     teb->Tib.StackBase = (void *)~0UL;




More information about the wine-cvs mailing list