about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorChris Denton <chris@chrisdenton.dev>2024-03-06 19:21:34 +0000
committerChris Denton <chris@chrisdenton.dev>2024-03-06 19:54:09 +0000
commit87183177255e39b2b3016cf82e8ba2fbb5d397f5 (patch)
treec7b67ef90a1fc56daf399219c9844bb6acdbdc2e /library/std/src
parent8cd7aaa105e06f99cbad3e9db677eedec1f2c4b4 (diff)
downloadrust-87183177255e39b2b3016cf82e8ba2fbb5d397f5.tar.gz
rust-87183177255e39b2b3016cf82e8ba2fbb5d397f5.zip
Document and test minimal stack size on Windows
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/sys/pal/windows/thread.rs2
-rw-r--r--library/std/src/thread/tests.rs13
2 files changed, 15 insertions, 0 deletions
diff --git a/library/std/src/sys/pal/windows/thread.rs b/library/std/src/sys/pal/windows/thread.rs
index 601ba095aa4..970bd9c6ce7 100644
--- a/library/std/src/sys/pal/windows/thread.rs
+++ b/library/std/src/sys/pal/windows/thread.rs
@@ -26,6 +26,8 @@ impl Thread {
     pub unsafe fn new(stack: usize, p: Box<dyn FnOnce()>) -> io::Result<Thread> {
         let p = Box::into_raw(Box::new(p));
 
+        // CreateThread rounds up values for the stack size to the nearest page size (at least 4kb).
+        // If a value of zero is given then the default stack size is used instead.
         let ret = c::CreateThread(
             ptr::null_mut(),
             stack,
diff --git a/library/std/src/thread/tests.rs b/library/std/src/thread/tests.rs
index 813ede06415..b81efac6761 100644
--- a/library/std/src/thread/tests.rs
+++ b/library/std/src/thread/tests.rs
@@ -423,3 +423,16 @@ fn scope_join_race() {
         });
     }
 }
+
+// Test that the smallest value for stack_size works on Windows.
+#[cfg(windows)]
+#[test]
+fn test_minimal_thread_stack() {
+    use crate::sync::atomic::AtomicU8;
+    static COUNT: AtomicU8 = AtomicU8::new(0);
+
+    let builder = thread::Builder::new().stack_size(1);
+    let before = builder.spawn(|| COUNT.fetch_add(1, Ordering::Relaxed)).unwrap().join().unwrap();
+    assert_eq!(before, 0);
+    assert_eq!(COUNT.load(Ordering::Relaxed), 1);
+}