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