From 7a8d06d32b9e77a734026bcdfdf4fb72bb24b2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Andr=C3=A9?= Date: Fri, 21 Aug 2026 17:24:29 +0200 Subject: [PATCH] fix(tauri): serialize CLI restart with shutdown Run the complete CLI stop/start restart while holding the shutdown coordinator authority. Shutdown now waits for an admitted restart, while restart requests arriving after shutdown begins fail without spawning another process. This prevents final cleanup from racing a restart that could recreate the embedded server immediately before application exit. Validated with cargo fmt and all 121 Tauri tests on Windows. --- packages/tauri-app/src-tauri/src/main.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/tauri-app/src-tauri/src/main.rs b/packages/tauri-app/src-tauri/src/main.rs index f3590554..3d3f273a 100644 --- a/packages/tauri-app/src-tauri/src/main.rs +++ b/packages/tauri-app/src-tauri/src/main.rs @@ -390,13 +390,16 @@ fn cli_restart( state: tauri::State, ) -> Result { require_local_app_window(&window, &state)?; - let dev_mode = is_dev_mode(); - state.manager.stop().map_err(|e| e.to_string())?; - state - .manager - .start(app, dev_mode) - .map_err(|e| e.to_string())?; - Ok(state.manager.status()) + shutdown::with_navigation_authority(&app, || { + let dev_mode = is_dev_mode(); + state.manager.stop().map_err(|e| e.to_string())?; + state + .manager + .start(app.clone(), dev_mode) + .map_err(|e| e.to_string())?; + Ok(state.manager.status()) + }) + .unwrap_or_else(|| Err("Application shutdown is in progress".to_string())) } #[tauri::command]