feat: recover core after panic, close #353

This commit is contained in:
GyDi 2023-01-14 11:45:47 +08:00
parent 439d885ee1
commit 453c230716
No known key found for this signature in database
GPG Key ID: 9C3AD40F1F99880A

View File

@ -161,6 +161,7 @@ impl CoreManager {
let mut sidecar = self.sidecar.lock(); let mut sidecar = self.sidecar.lock();
*sidecar = Some(cmd_child); *sidecar = Some(cmd_child);
drop(sidecar);
tauri::async_runtime::spawn(async move { tauri::async_runtime::spawn(async move {
while let Some(event) = rx.recv().await { while let Some(event) = rx.recv().await {
@ -181,6 +182,7 @@ impl CoreManager {
} }
CommandEvent::Terminated(_) => { CommandEvent::Terminated(_) => {
log::info!(target: "app", "clash core terminated"); log::info!(target: "app", "clash core terminated");
let _ = CoreManager::global().recover_core();
break; break;
} }
_ => {} _ => {}
@ -191,6 +193,37 @@ impl CoreManager {
Ok(()) 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<()> { pub fn stop_core(&self) -> Result<()> {
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]