mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 04:44:44 +00:00
Add exec_new_thread
This commit is contained in:
parent
fe7ce9d1b3
commit
0e928c758f
6 changed files with 31 additions and 58 deletions
|
@ -21,6 +21,7 @@ pub mod python_util;
|
||||||
pub mod serialize;
|
pub mod serialize;
|
||||||
pub mod set;
|
pub mod set;
|
||||||
pub mod shared;
|
pub mod shared;
|
||||||
|
pub mod spawn;
|
||||||
pub mod stdin;
|
pub mod stdin;
|
||||||
pub mod str;
|
pub mod str;
|
||||||
pub mod style;
|
pub mod style;
|
||||||
|
|
22
compiler/erg_common/spawn.rs
Normal file
22
compiler/erg_common/spawn.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
use std::thread;
|
||||||
|
|
||||||
|
/// 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) -> T
|
||||||
|
where
|
||||||
|
F: FnOnce() -> T + Send + 'static,
|
||||||
|
T: Send + 'static,
|
||||||
|
{
|
||||||
|
if cfg!(windows) {
|
||||||
|
const STACK_SIZE: usize = 4 * 1024 * 1024;
|
||||||
|
let child = thread::Builder::new()
|
||||||
|
.stack_size(STACK_SIZE)
|
||||||
|
.spawn(run)
|
||||||
|
.unwrap();
|
||||||
|
// Wait for thread to join
|
||||||
|
child.join().unwrap()
|
||||||
|
} else {
|
||||||
|
run()
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,9 +3,9 @@ extern crate erg_compiler;
|
||||||
extern crate erg_parser;
|
extern crate erg_parser;
|
||||||
|
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::thread;
|
|
||||||
|
|
||||||
use erg_common::config::ErgConfig;
|
use erg_common::config::ErgConfig;
|
||||||
|
use erg_common::spawn::exec_new_thread;
|
||||||
use erg_common::traits::Runnable;
|
use erg_common::traits::Runnable;
|
||||||
|
|
||||||
use erg_compiler::build_hir::HIRBuilder;
|
use erg_compiler::build_hir::HIRBuilder;
|
||||||
|
@ -49,17 +49,5 @@ fn run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
if cfg!(windows) {
|
exec_new_thread(run);
|
||||||
const STACK_SIZE: usize = 4 * 1024 * 1024;
|
|
||||||
|
|
||||||
let child = thread::Builder::new()
|
|
||||||
.stack_size(STACK_SIZE)
|
|
||||||
.spawn(run)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// Wait for thread to join
|
|
||||||
child.join().unwrap();
|
|
||||||
} else {
|
|
||||||
run();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,9 @@ extern crate erg_common;
|
||||||
extern crate erg_parser;
|
extern crate erg_parser;
|
||||||
|
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::thread;
|
|
||||||
|
|
||||||
use erg_common::config::ErgConfig;
|
use erg_common::config::ErgConfig;
|
||||||
|
use erg_common::spawn::exec_new_thread;
|
||||||
use erg_common::traits::Runnable;
|
use erg_common::traits::Runnable;
|
||||||
|
|
||||||
use erg_parser::build_ast::ASTBuilder;
|
use erg_parser::build_ast::ASTBuilder;
|
||||||
|
@ -31,17 +31,5 @@ fn run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
if cfg!(windows) {
|
exec_new_thread(run);
|
||||||
const STACK_SIZE: usize = 4 * 1024 * 1024;
|
|
||||||
|
|
||||||
let child = thread::Builder::new()
|
|
||||||
.stack_size(STACK_SIZE)
|
|
||||||
.spawn(run)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// Wait for thread to join
|
|
||||||
child.join().unwrap();
|
|
||||||
} else {
|
|
||||||
run();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
18
src/main.rs
18
src/main.rs
|
@ -3,10 +3,9 @@ extern crate erg_compiler;
|
||||||
extern crate erg_parser;
|
extern crate erg_parser;
|
||||||
|
|
||||||
use std::process;
|
use std::process;
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
use std::thread;
|
|
||||||
|
|
||||||
use erg_common::config::ErgConfig;
|
use erg_common::config::ErgConfig;
|
||||||
|
use erg_common::spawn::exec_new_thread;
|
||||||
use erg_common::traits::Runnable;
|
use erg_common::traits::Runnable;
|
||||||
|
|
||||||
use erg_parser::build_ast::ASTBuilder;
|
use erg_parser::build_ast::ASTBuilder;
|
||||||
|
@ -59,18 +58,5 @@ fn run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
#[cfg(target_os = "windows")]
|
exec_new_thread(run);
|
||||||
{
|
|
||||||
const STACK_SIZE: usize = 4 * 1024 * 1024;
|
|
||||||
|
|
||||||
let child = thread::Builder::new()
|
|
||||||
.stack_size(STACK_SIZE)
|
|
||||||
.spawn(run)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// Wait for thread to join
|
|
||||||
child.join().unwrap();
|
|
||||||
}
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
|
||||||
run();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ use std::path::PathBuf;
|
||||||
use erg_common::config::ErgConfig;
|
use erg_common::config::ErgConfig;
|
||||||
use erg_common::error::MultiErrorDisplay;
|
use erg_common::error::MultiErrorDisplay;
|
||||||
use erg_common::python_util::PythonVersion;
|
use erg_common::python_util::PythonVersion;
|
||||||
|
use erg_common::spawn::exec_new_thread;
|
||||||
use erg_common::traits::{Runnable, Stream};
|
use erg_common::traits::{Runnable, Stream};
|
||||||
|
|
||||||
use erg_compiler::error::CompileErrors;
|
use erg_compiler::error::CompileErrors;
|
||||||
|
@ -268,19 +269,6 @@ fn _exec_vm(file_path: &'static str) -> Result<i32, CompileErrors> {
|
||||||
vm.exec()
|
vm.exec()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
fn exec_vm(file_path: &'static str) -> Result<i32, CompileErrors> {
|
fn exec_vm(file_path: &'static str) -> Result<i32, CompileErrors> {
|
||||||
const STACK_SIZE: usize = 4 * 1024 * 1024;
|
exec_new_thread(move || _exec_vm(file_path))
|
||||||
|
|
||||||
let child = std::thread::Builder::new()
|
|
||||||
.stack_size(STACK_SIZE)
|
|
||||||
.spawn(move || _exec_vm(file_path))
|
|
||||||
.unwrap();
|
|
||||||
// Wait for thread to join
|
|
||||||
child.join().unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
|
||||||
fn exec_vm(file_path: &'static str) -> Result<i32, CompileErrors> {
|
|
||||||
_exec_vm(file_path)
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue