From 453c2307163c93208b4a9dc030006a77cb59b97a Mon Sep 17 00:00:00 2001 From: GyDi Date: Sat, 14 Jan 2023 11:45:47 +0800 Subject: [PATCH] feat: recover core after panic, close #353 --- src-tauri/src/core/core.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index e4e090e..cfce65e 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -161,6 +161,7 @@ impl CoreManager { let mut sidecar = self.sidecar.lock(); *sidecar = Some(cmd_child); + drop(sidecar); tauri::async_runtime::spawn(async move { while let Some(event) = rx.recv().await { @@ -181,6 +182,7 @@ impl CoreManager { } CommandEvent::Terminated(_) => { log::info!(target: "app", "clash core terminated"); + let _ = CoreManager::global().recover_core(); break; } _ => {} @@ -191,6 +193,37 @@ impl CoreManager { Ok(()) } + /// 重启内核 + pub fn recover_core(&'static self) -> Result<()> { + // 服务模式不管 + #[cfg(target_os = "windows")] + if *self.use_service_mode.lock() { + return Ok(()); + } + + // 清空原来的sidecar值 + if let Some(sidecar) = self.sidecar.lock().take() { + let _ = sidecar.kill(); + } + + tauri::async_runtime::spawn(async move { + // 6秒之后再查看服务是否正常 (时间随便搞的) + // terminated 可能是切换内核 (切换内核已经有500ms的延迟) + sleep(Duration::from_millis(6666)).await; + + if self.sidecar.lock().is_none() { + log::info!(target: "app", "recover clash core"); + + // 重新启动app + if let Err(_) = self.run_core().await { + let _ = self.recover_core(); + } + } + }); + + Ok(()) + } + /// 停止核心运行 pub fn stop_core(&self) -> Result<()> { #[cfg(target_os = "windows")]