about summary refs log tree commit diff
path: root/tests/ui
diff options
context:
space:
mode:
authorStuart Cook <Zalathar@users.noreply.github.com>2024-11-08 18:51:30 +1100
committerGitHub <noreply@github.com>2024-11-08 18:51:30 +1100
commit4b904ceb464040ebf85e569b33cca11df563f1cd (patch)
tree51a878e8edd0526792eb33cd5f46c0441b00f0d3 /tests/ui
parent3a48d801557a571c819ce62764ae2cc18605e5c8 (diff)
parent9827c6dc2c1b81ec4e30a630e297745341977288 (diff)
downloadrust-4b904ceb464040ebf85e569b33cca11df563f1cd.tar.gz
rust-4b904ceb464040ebf85e569b33cca11df563f1cd.zip
Rollup merge of #132738 - cuviper:channel-heap-init, r=ibraheemdev
Initialize channel `Block`s directly on the heap

The channel's `Block::new` was causing a stack overflow because it held
32 item slots, instantiated on the stack before moving to `Box::new`.
The 32x multiplier made modestly-large item sizes untenable.

That block is now initialized directly on the heap.

Fixes #102246

try-job: test-various
Diffstat (limited to 'tests/ui')
-rw-r--r--tests/ui/std/channel-stack-overflow-issue-102246.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/tests/ui/std/channel-stack-overflow-issue-102246.rs b/tests/ui/std/channel-stack-overflow-issue-102246.rs
new file mode 100644
index 00000000000..984ebdd553f
--- /dev/null
+++ b/tests/ui/std/channel-stack-overflow-issue-102246.rs
@@ -0,0 +1,29 @@
+//@ run-pass
+//@ needs-threads
+//@ compile-flags: -Copt-level=0
+
+// The channel's `Block::new` was causing a stack overflow because it held 32 item slots, which is
+// 1MiB for this test's `BigStruct` -- instantiated on the stack before moving to `Box::new`.
+//
+// That block is now initialized directly on the heap.
+//
+// Ref: https://github.com/rust-lang/rust/issues/102246
+
+use std::sync::mpsc::channel;
+use std::thread;
+
+const N: usize = 32_768;
+struct BigStruct {
+    _data: [u8; N],
+}
+
+fn main() {
+    let (sender, receiver) = channel::<BigStruct>();
+
+    let thread1 = thread::spawn(move || {
+        sender.send(BigStruct { _data: [0u8; N] }).unwrap();
+    });
+
+    thread1.join().unwrap();
+    for _data in receiver.try_iter() {}
+}