Alexandre Julliard : ntdll: Move signal stack size computation to the common code.

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


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

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

ntdll: Move signal stack size computation to the common code.

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

---

 dlls/ntdll/ntdll_misc.h     |  3 +++
 dlls/ntdll/signal_arm.c     | 14 ++------------
 dlls/ntdll/signal_arm64.c   |  1 -
 dlls/ntdll/signal_i386.c    | 21 ++++-----------------
 dlls/ntdll/signal_powerpc.c | 14 ++------------
 dlls/ntdll/signal_x86_64.c  | 17 ++---------------
 dlls/ntdll/virtual.c        | 12 ++++++++++++
 7 files changed, 25 insertions(+), 57 deletions(-)

diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index 55de8dbce8..7b139db90c 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -77,6 +77,9 @@ extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN;
 extern LPCSTR debugstr_ObjectAttributes(const OBJECT_ATTRIBUTES *oa) DECLSPEC_HIDDEN;
 
 /* init routines */
+extern SIZE_T signal_stack_size DECLSPEC_HIDDEN;
+extern SIZE_T signal_stack_mask DECLSPEC_HIDDEN;
+extern SIZE_T signal_stack_align DECLSPEC_HIDDEN;
 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;
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index 5935f5f8d9..3654fe38e5 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -966,22 +966,12 @@ void signal_init_threading(void)
  */
 NTSTATUS signal_alloc_thread( TEB **teb )
 {
-    static size_t sigstack_alignment;
-    SIZE_T size;
+    SIZE_T size = signal_stack_mask + 1;
     NTSTATUS status;
 
-    if (!sigstack_alignment)
-    {
-        size_t min_size = page_size;
-        /* find the first power of two not smaller than min_size */
-        while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
-        assert( sizeof(TEB) <= min_size );
-    }
-
-    size = 1 << sigstack_alignment;
     *teb = NULL;
     if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
-                                          PAGE_READWRITE, sigstack_alignment )))
+                                          PAGE_READWRITE, signal_stack_align )))
     {
         (*teb)->Tib.Self = &(*teb)->Tib;
         (*teb)->Tib.ExceptionList = (void *)~0UL;
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 2c61d8a774..2c03169395 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -111,7 +111,6 @@ static DWORD64 get_fault_esr( ucontext_t *sigcontext )
 #endif /* linux */
 
 static const size_t teb_size = 0x2000;  /* we reserve two pages for the TEB */
-static const size_t signal_stack_size = max( MINSIGSTKSZ, 8192 );
 
 /* stack layout when calling an exception raise function */
 struct stack_layout
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index f7cdbd606e..151c72263b 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -474,8 +474,6 @@ struct stack_layout
 typedef int (*wine_signal_handler)(unsigned int sig);
 
 static const size_t teb_size = 4096;  /* we reserve one page for the TEB */
-static size_t signal_stack_mask;
-static size_t signal_stack_size;
 
 static ULONG first_ldt_entry = 32;
 
@@ -2592,26 +2590,14 @@ void signal_init_threading(void)
  */
 NTSTATUS signal_alloc_thread( TEB **teb )
 {
-    static size_t sigstack_alignment;
     struct x86_thread_data *thread_data;
-    SIZE_T size;
+    SIZE_T size = signal_stack_mask + 1;
     void *addr = NULL;
     NTSTATUS status;
-    int first_thread = !sigstack_alignment;
+    static int first_thread = 1;
 
-    if (!sigstack_alignment)
-    {
-        size_t min_size = teb_size + max( MINSIGSTKSZ, 8192 );
-        /* find the first power of two not smaller than min_size */
-        sigstack_alignment = 12;
-        while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
-        signal_stack_mask = (1 << sigstack_alignment) - 1;
-        signal_stack_size = (1 << sigstack_alignment) - teb_size;
-    }
-
-    size = signal_stack_mask + 1;
     if (!(status = virtual_alloc_aligned( &addr, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
-                                          PAGE_READWRITE, sigstack_alignment )))
+                                          PAGE_READWRITE, signal_stack_align )))
     {
         *teb = addr;
         (*teb)->Tib.Self = &(*teb)->Tib;
@@ -2623,6 +2609,7 @@ NTSTATUS signal_alloc_thread( TEB **teb )
             NtFreeVirtualMemory( NtCurrentProcess(), &addr, &size, MEM_RELEASE );
             status = STATUS_TOO_MANY_THREADS;
         }
+        first_thread = 0;
     }
     return status;
 }
diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c
index 0ef71af351..81bb8fc596 100644
--- a/dlls/ntdll/signal_powerpc.c
+++ b/dlls/ntdll/signal_powerpc.c
@@ -1027,22 +1027,12 @@ void signal_init_threading(void)
  */
 NTSTATUS signal_alloc_thread( TEB **teb )
 {
-    static size_t sigstack_alignment;
-    SIZE_T size;
+    SIZE_T size = signal_stack_mask + 1;
     NTSTATUS status;
 
-    if (!sigstack_alignment)
-    {
-        size_t min_size = page_size;  /* this is just for the TEB, we don't use a signal stack yet */
-        /* find the first power of two not smaller than min_size */
-        while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
-        assert( sizeof(TEB) <= min_size );
-    }
-
-    size = 1 << sigstack_alignment;
     *teb = NULL;
     if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
-                                          PAGE_READWRITE, sigstack_alignment )))
+                                          PAGE_READWRITE, signal_stack_align )))
     {
         (*teb)->Tib.Self = &(*teb)->Tib;
         (*teb)->Tib.ExceptionList = (void *)~0UL;
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index b53edf7633..2f4acbc27a 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -282,7 +282,6 @@ enum i386_trap_code
 };
 
 static const size_t teb_size = 0x2000;  /* we reserve two pages for the TEB */
-static size_t signal_stack_size;
 
 typedef void (*raise_func)( EXCEPTION_RECORD *rec, CONTEXT *context );
 
@@ -3120,24 +3119,12 @@ void signal_init_threading(void)
  */
 NTSTATUS signal_alloc_thread( TEB **teb )
 {
-    static size_t sigstack_alignment;
-    SIZE_T size;
+    SIZE_T size = signal_stack_mask + 1;
     NTSTATUS status;
 
-    if (!sigstack_alignment)
-    {
-        size_t min_size = teb_size + max( MINSIGSTKSZ, 8192 );
-        /* find the first power of two not smaller than min_size */
-        sigstack_alignment = 12;
-        while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
-        signal_stack_size = (1 << sigstack_alignment) - teb_size;
-        assert( sizeof(TEB) <= teb_size );
-    }
-
-    size = 1 << sigstack_alignment;
     *teb = NULL;
     if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
-                                          PAGE_READWRITE, sigstack_alignment )))
+                                          PAGE_READWRITE, signal_stack_align )))
     {
         (*teb)->Tib.Self = &(*teb)->Tib;
         (*teb)->Tib.ExceptionList = (void *)~0UL;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 6ad2d21e01..f9a461bdd8 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -31,6 +31,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <signal.h>
 #include <sys/types.h>
 #ifdef HAVE_SYS_SOCKET_H
 # include <sys/socket.h>
@@ -159,6 +160,10 @@ static void *address_space_start = (void *)0x10000;
 #endif  /* __i386__ */
 static const BOOL is_win64 = (sizeof(void *) > sizeof(int));
 
+SIZE_T signal_stack_size = 0;
+SIZE_T signal_stack_mask = 0;
+SIZE_T signal_stack_align = 0;
+
 #define ROUND_ADDR(addr,mask) \
    ((void *)((UINT_PTR)(addr) & ~(UINT_PTR)(mask)))
 
@@ -1974,6 +1979,13 @@ void virtual_init(void)
         }
     }
 
+    size = ROUND_SIZE( 0, sizeof(TEB) ) + max( MINSIGSTKSZ, 8192 );
+    /* find the first power of two not smaller than size */
+    signal_stack_align = page_shift;
+    while ((1u << signal_stack_align) < size) signal_stack_align++;
+    signal_stack_mask = (1 << signal_stack_align) - 1;
+    signal_stack_size = (1 << signal_stack_align) - ROUND_SIZE( 0, sizeof(TEB) );
+
     /* try to find space in a reserved area for the views and pages protection table */
 #ifdef _WIN64
     pages_vprot_size = ((size_t)address_space_limit >> page_shift >> pages_vprot_shift) + 1;




More information about the wine-cvs mailing list