diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 1c3088ae400..55de8dbce8d 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 63c008224df..5935f5f8d99 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 15e78dbb562..2c61d8a7749 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 c953d18a652..f7cdbd606e8 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 ee765e226b1..0ef71af3517 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 2f9c3dae228..b53edf7633d 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 73b5c9ebca7..7353c86899f 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;