mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-03 18:29:00 +00:00
36 lines
1.1 KiB
Rust
36 lines
1.1 KiB
Rust
#[cfg(all(unix, any(feature = "debug", feature = "backtrace")))]
|
|
pub use backtrace_on_stack_overflow;
|
|
use std::thread;
|
|
|
|
#[macro_export]
|
|
macro_rules! enable_overflow_stacktrace {
|
|
() => {
|
|
#[cfg(all(unix, any(feature = "debug", feature = "backtrace")))]
|
|
unsafe {
|
|
$crate::spawn::backtrace_on_stack_overflow::enable()
|
|
};
|
|
};
|
|
}
|
|
|
|
/// Execute a function in a new thread on Windows, otherwise just run it.
|
|
///
|
|
/// Windows has a smaller default stack size than other OSs, which may cause a stack overflow, especially in the parsing process.
|
|
pub fn exec_new_thread<F, T>(run: F, name: &str) -> T
|
|
where
|
|
F: FnOnce() -> T + Send + 'static,
|
|
T: Send + 'static,
|
|
{
|
|
enable_overflow_stacktrace!();
|
|
if cfg!(windows) || cfg!(feature = "large_thread") {
|
|
const STACK_SIZE: usize = 4 * 1024 * 1024;
|
|
let child = thread::Builder::new()
|
|
.name(name.to_string())
|
|
.stack_size(STACK_SIZE)
|
|
.spawn(run)
|
|
.unwrap();
|
|
// Wait for thread to join
|
|
child.join().unwrap()
|
|
} else {
|
|
run()
|
|
}
|
|
}
|