- Timestamp:
- Mar 18, 2012, 12:41:27 AM (13 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmthread.cpp
r21916 r21981 79 79 pHMHandleData->dwUserData = (DWORD)threadobj; 80 80 81 // round up to page size 82 cbStack = (cbStack + 0xFFF) & ~0xFFF; 83 84 // per default 1MB stack per thread 85 DWORD cbTotalStack = (WinExe) ? WinExe->getDefaultStackSize() : 0x100000; 86 DWORD cbCommitStack = 0; 87 if (fdwCreate & STACK_SIZE_PARAM_IS_A_RESERVATION) { 88 if (cbStack) 89 cbTotalStack = cbStack; 90 } else { 91 if (cbStack >= cbTotalStack) { 92 // round up the new reserved size to 1MB 93 cbTotalStack = (cbStack + 0xFFFFF) & ~0xFFFFF; 94 cbCommitStack = cbStack; 95 } else if (cbStack) { 96 cbCommitStack = cbStack; 97 } 98 } 99 100 dprintf(("Thread stack size 0x%X (0x%X to commit)", cbTotalStack, cbCommitStack)); 101 81 102 //SvL: This doesn't really create a thread, but only sets up the 82 103 // handle of the current thread. … … 85 106 return pHMHandleData->hHMHandle; 86 107 } 87 winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate, hThread );108 winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate, hThread, cbCommitStack); 88 109 89 110 if(winthread == 0) { … … 100 121 } 101 122 102 // @@@PH Note: with debug code enabled, ODIN might request more stack space!103 //SvL: Also need more stack in release build (RealPlayer 7 sometimes runs104 // out of stack105 if (cbStack > 0) {106 cbStack <<= 1; // double stack107 }108 else {109 cbStack = (WinExe) ? WinExe->getDefaultStackSize() : 0x100000; // per default 1MB stack per thread110 }111 dprintf(("Thread stack size 0x%x", cbStack));112 113 123 //************************************************************************************ 114 124 //NOTE: If we ever decide to allocate our own stack, then we MUST use VirtualAlloc!!!! 115 125 // (alignment reasons) 116 126 //************************************************************************************ 117 pHMHandleData->hHMHandle = O32_CreateThread(lpsa, cb Stack, winthread->GetOS2Callback(),127 pHMHandleData->hHMHandle = O32_CreateThread(lpsa, cbTotalStack, winthread->GetOS2Callback(), 118 128 (LPVOID)winthread, fdwCreate, lpIDThread); 119 129 -
trunk/src/kernel32/thread.cpp
r21953 r21981 674 674 //****************************************************************************** 675 675 //****************************************************************************** 676 Win32Thread::Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags, HANDLE hThread )676 Win32Thread::Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags, HANDLE hThread, DWORD cbCommitStack) 677 677 { 678 678 lpUserData = lpData; … … 680 680 this->dwFlags = dwFlags; 681 681 this->hThread = hThread; 682 this->cbCommitStack = cbCommitStack; 682 683 683 684 teb = CreateTEB(hThread, 0xFFFFFFFF); … … 721 722 722 723 dprintf(("Stack top 0x%x, stack end 0x%x", winteb->stack_top, winteb->stack_low)); 724 725 if (me->cbCommitStack) { 726 // pre-commit part of the stack 727 PBYTE stack = ((PBYTE) (winteb->stack_top)) - 1; 728 for (int i = 0; i < (me->cbCommitStack + 0xFFF) / 0x1000; i++) { 729 BYTE unused = *stack; 730 unused = unused; 731 stack -= 0x1000; 732 } 733 } 723 734 724 735 if( IsDBCSEnv()) -
trunk/src/kernel32/thread.h
r21916 r21981 18 18 { 19 19 public: 20 Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags, HANDLE hThread );20 Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags, HANDLE hThread, DWORD cbCommitStack); 21 21 22 22 PTHREAD_START_ROUTINE_O32 GetOS2Callback() { return Win32ThreadProc; }; … … 31 31 HANDLE hThread; 32 32 LPVOID teb; 33 DWORD cbCommitStack; 33 34 34 35 static DWORD OPEN32API Win32ThreadProc(LPVOID lpData);
Note:
See TracChangeset
for help on using the changeset viewer.