Skip to content

Commit db54765

Browse files
committed
Auto merge of #52847 - upsuper:thread-stack-reserve, r=alexcrichton
Don't commit thread stack on Windows On Windows, there is a system level resource limitation called commit limit, which is roughly the sum of physical memory + paging files[1]. `CreateThread` by default commits the stack size[2], which unnecessarily takes such resource from the shared limit. This PR changes it to only reserve the stack size rather than commit it. Reserved memory would only take the address space of the current process until it's actually accessed. This should make the behavior on Windows match other platforms, and is also a pretty standard practice on Windows nowadays. [1] https://blogs.technet.microsoft.com/markrussinovich/2008/11/17/pushing-the-limits-of-windows-virtual-memory/ [2] https://docs.microsoft.com/zh-cn/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createthread
2 parents 60c1ee7 + fc8bb9c commit db54765

File tree

2 files changed

+4
-1
lines changed

2 files changed

+4
-1
lines changed

src/libstd/sys/windows/c.rs

+2
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ pub const PIPE_READMODE_BYTE: DWORD = 0x00000000;
296296

297297
pub const FD_SETSIZE: usize = 64;
298298

299+
pub const STACK_SIZE_PARAM_IS_A_RESERVATION: DWORD = 0x00010000;
300+
299301
#[repr(C)]
300302
#[cfg(not(target_pointer_width = "64"))]
301303
pub struct WSADATA {

src/libstd/sys/windows/thread.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ impl Thread {
4242
let stack_size = (stack + 0xfffe) & (!0xfffe);
4343
let ret = c::CreateThread(ptr::null_mut(), stack_size,
4444
thread_start, &*p as *const _ as *mut _,
45-
0, ptr::null_mut());
45+
c::STACK_SIZE_PARAM_IS_A_RESERVATION,
46+
ptr::null_mut());
4647

4748
return if ret as usize == 0 {
4849
Err(io::Error::last_os_error())

0 commit comments

Comments
 (0)