//@ 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::Builder; const N: usize = 32_768; const SLOTS: usize = 32; // Use a stack size that's smaller than N * SLOTS, proving the allocation is on the heap. // // The test explicitly specifies the stack size, because not all platforms have the same default // size. const STACK_SIZE: usize = (N*SLOTS) - 1; struct BigStruct { _data: [u8; N], } fn main() { let (sender, receiver) = channel::(); let thread1 = Builder::new().stack_size(STACK_SIZE).spawn(move || { sender.send(BigStruct { _data: [0u8; N] }).unwrap(); }).expect("thread1 should spawn successfully"); thread1.join().unwrap(); let thread2 = Builder::new().stack_size(STACK_SIZE).spawn(move || { for _data in receiver.try_iter() {} }).expect("thread2 should spawn successfully"); thread2.join().unwrap(); }