diff --git a/parachain/src/wasm_executor/validation_host.rs b/parachain/src/wasm_executor/validation_host.rs index 2b83ac943a0a..249ad964670b 100644 --- a/parachain/src/wasm_executor/validation_host.rs +++ b/parachain/src/wasm_executor/validation_host.rs @@ -227,6 +227,7 @@ unsafe impl Send for ValidationHost {} #[derive(Default)] struct ValidationHost { worker: Option, + worker_thread: Option>>, memory: Option, id: u32, } @@ -260,23 +261,38 @@ impl ValidationHost { return Ok(()); } } + if self.worker_thread.is_some() { + return Ok(()); + } + let memory = Self::create_memory()?; - let (cmd, args) = match execution_mode { - ValidationExecutionMode::InProcess => todo!(), - ValidationExecutionMode::ExternalProcessSelfHost => ( + + let mut run_worker_process = |cmd: PathBuf, args: Vec| -> Result<(), std::io::Error> { + debug!("Starting worker at {:?} with arguments: {:?} and {:?}", cmd, args, memory.get_os_path()); + let worker = process::Command::new(cmd) + .args(args) + .arg(memory.get_os_path()) + .stdin(process::Stdio::piped()) + .spawn()?; + self.id = worker.id(); + self.worker = Some(worker); + Ok(()) + }; + + match execution_mode { + ValidationExecutionMode::InProcess => { + let mem_id = memory.get_os_path().to_string(); + self.worker_thread = Some(std::thread::spawn(move || run_worker(mem_id.as_str()))); + }, + ValidationExecutionMode::ExternalProcessSelfHost => run_worker_process( env::current_exe()?, - WORKER_ARGS.iter().map(|x| x.to_string()).collect() - ), - ValidationExecutionMode::ExternalProcessCustomHost { binary, args } => (binary, args), + WORKER_ARGS.iter().map(|x| x.to_string()).collect(), + )?, + ValidationExecutionMode::ExternalProcessCustomHost { binary, args } => run_worker_process( + binary, + args, + )?, }; - debug!("Starting worker at {:?} with arguments: {:?} and {:?}", cmd, args, memory.get_os_path()); - let worker = process::Command::new(cmd) - .args(args) - .arg(memory.get_os_path()) - .stdin(process::Stdio::piped()) - .spawn()?; - self.id = worker.id(); - self.worker = Some(worker); memory.wait( Event::WorkerReady as usize,