Alexandre Julliard : kernel: Moved main stack initialization to process.c.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 12 11:10:24 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 8a8a94aecbfcd908e5909113ea2139ce17c41b56
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=8a8a94aecbfcd908e5909113ea2139ce17c41b56

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Dec 12 17:20:29 2005 +0100

kernel: Moved main stack initialization to process.c.

---

 dlls/kernel/kernel_private.h |    3 ---
 dlls/kernel/process.c        |   40 +++++++++++++++++++++++++++++++++-------
 dlls/kernel/thread.c         |   28 ----------------------------
 3 files changed, 33 insertions(+), 38 deletions(-)

diff --git a/dlls/kernel/kernel_private.h b/dlls/kernel/kernel_private.h
index 98195d4..7139ffb 100644
--- a/dlls/kernel/kernel_private.h
+++ b/dlls/kernel/kernel_private.h
@@ -115,9 +115,6 @@ extern LPVOID DOSMEM_MapDosToLinear(UINT
 extern UINT   DOSMEM_MapLinearToDos(LPVOID); /* linear Wine to DOS */
 extern void   load_winedos(void);
 
-/* thread.c */
-extern TEB *THREAD_InitStack( TEB *teb, DWORD stack_size );
-
 /* environ.c */
 extern void ENV_CopyStartupInformation(void);
 
diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c
index d95d08c..af9e23f 100644
--- a/dlls/kernel/process.c
+++ b/dlls/kernel/process.c
@@ -967,6 +967,38 @@ static BOOL process_init(void)
 
 
 /***********************************************************************
+ *           init_stack
+ *
+ * Allocate the stack of new process.
+ */
+static void *init_stack(void)
+{
+    void *base;
+    SIZE_T stack_size, page_size = getpagesize();
+    IMAGE_NT_HEADERS *nt = RtlImageNtHeader( NtCurrentTeb()->Peb->ImageBaseAddress );
+
+    stack_size = max( nt->OptionalHeader.SizeOfStackReserve, nt->OptionalHeader.SizeOfStackCommit );
+    stack_size = (stack_size + (page_size - 1)) & ~(page_size - 1);
+    if (stack_size < 1024 * 1024) stack_size = 1024 * 1024;  /* Xlib needs a large stack */
+
+    if (!(base = VirtualAlloc( NULL, stack_size, MEM_COMMIT, PAGE_READWRITE )))
+    {
+        ERR( "failed to allocate main process stack\n" );
+        ExitProcess( 1 );
+    }
+
+    /* note: limit is lower than base since the stack grows down */
+    NtCurrentTeb()->DeallocationStack = base;
+    NtCurrentTeb()->Tib.StackBase     = (char *)base + stack_size;
+    NtCurrentTeb()->Tib.StackLimit    = base;
+
+    /* setup guard page */
+    VirtualProtect( base, 1, PAGE_READWRITE | PAGE_GUARD, NULL );
+    return NtCurrentTeb()->Tib.StackBase;
+}
+
+
+/***********************************************************************
  *           start_process
  *
  * Startup routine of a new process. Runs on the new process stack.
@@ -1010,7 +1042,6 @@ void __wine_kernel_init(void)
 {
     WCHAR *main_exe_name, *p;
     char error[1024];
-    DWORD stack_size = 0;
     int file_exists;
     PEB *peb = NtCurrentTeb()->Peb;
 
@@ -1130,13 +1161,8 @@ void __wine_kernel_init(void)
     set_library_wargv( __wine_main_argv );
     if (!build_command_line( __wine_main_wargv )) goto error;
 
-    stack_size = RtlImageNtHeader(peb->ImageBaseAddress)->OptionalHeader.SizeOfStackReserve;
-
-    /* allocate main thread stack */
-    if (!THREAD_InitStack( NtCurrentTeb(), stack_size )) goto error;
-
     /* switch to the new stack */
-    wine_switch_to_stack( start_process, NULL, NtCurrentTeb()->Tib.StackBase );
+    wine_switch_to_stack( start_process, NULL, init_stack() );
 
  error:
     ExitProcess( GetLastError() );
diff --git a/dlls/kernel/thread.c b/dlls/kernel/thread.c
index fd65b99..c927037 100644
--- a/dlls/kernel/thread.c
+++ b/dlls/kernel/thread.c
@@ -49,34 +49,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(thread);
 WINE_DECLARE_DEBUG_CHANNEL(relay);
 
 
-/***********************************************************************
- *           THREAD_InitStack
- *
- * Allocate the stack of a thread.
- */
-TEB *THREAD_InitStack( TEB *teb, DWORD stack_size )
-{
-    DWORD old_prot;
-    DWORD page_size = getpagesize();
-    void *base;
-
-    stack_size = (stack_size + (page_size - 1)) & ~(page_size - 1);
-    if (stack_size < 1024 * 1024) stack_size = 1024 * 1024;  /* Xlib needs a large stack */
-
-    if (!(base = VirtualAlloc( NULL, stack_size, MEM_COMMIT, PAGE_READWRITE )))
-        return NULL;
-
-    teb->DeallocationStack = base;
-    teb->Tib.StackBase     = (char *)base + stack_size;
-    teb->Tib.StackLimit    = base;  /* note: limit is lower than base since the stack grows down */
-
-    /* Setup guard pages */
-
-    VirtualProtect( base, 1, PAGE_READWRITE | PAGE_GUARD, &old_prot );
-    return teb;
-}
-
-
 struct new_thread_info
 {
     LPTHREAD_START_ROUTINE func;




More information about the wine-cvs mailing list