quit cm process if ipc connection to ipc server closed (#9292)

Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
21pages 2024-09-08 12:37:41 +08:00 committed by GitHub
parent c8cd564e69
commit 993862c103
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 23 additions and 3 deletions

View File

@ -84,6 +84,7 @@ lazy_static::lazy_static! {
// Is server logic running. The server code can invoked to run by the main process if --server is not running.
static ref SERVER_RUNNING: Arc<RwLock<bool>> = Default::default();
static ref IS_MAIN: bool = std::env::args().nth(1).map_or(true, |arg| !arg.starts_with("--"));
static ref IS_CM: bool = std::env::args().nth(1) == Some("--cm".to_owned()) || std::env::args().nth(1) == Some("--cm-no-ui".to_owned());
}
pub struct SimpleCallOnReturn {
@ -137,6 +138,11 @@ pub fn is_main() -> bool {
*IS_MAIN
}
#[inline]
pub fn is_cm() -> bool {
*IS_CM
}
// Is server logic running.
#[inline]
pub fn is_server_running() -> bool {

View File

@ -477,7 +477,10 @@ pub fn core_main() -> Option<Vec<String>> {
} else if args[0] == "--cm-no-ui" {
#[cfg(feature = "flutter")]
#[cfg(not(any(target_os = "android", target_os = "ios", target_os = "windows")))]
crate::flutter::connection_manager::start_cm_no_ui();
{
crate::ui_interface::start_option_status_sync();
crate::flutter::connection_manager::start_cm_no_ui();
}
return None;
} else {
#[cfg(all(feature = "flutter", feature = "plugin_framework"))]

View File

@ -625,7 +625,6 @@ pub async fn start_ipc<T: InvokeUiCM>(cm: ConnectionManager<T>) {
OPTION_ENABLE_FILE_TRANSFER,
&Config::get_option(OPTION_ENABLE_FILE_TRANSFER),
));
match ipc::new_listener("_cm").await {
Ok(mut incoming) => {
while let Some(result) = incoming.next().await {
@ -647,7 +646,7 @@ pub async fn start_ipc<T: InvokeUiCM>(cm: ConnectionManager<T>) {
log::error!("Failed to start cm ipc server: {}", err);
}
}
crate::platform::quit_gui();
quit_cm();
}
#[cfg(target_os = "android")]
@ -1042,3 +1041,11 @@ pub fn close_voice_call(id: i32) {
allow_err!(client.tx.send(Data::CloseVoiceCall("".to_owned())));
};
}
#[cfg(not(any(target_os = "android", target_os = "ios")))]
pub fn quit_cm() {
// in case of std::process::exit not work
log::info!("quit cm");
CLIENTS.write().unwrap().clear();
crate::platform::quit_gui();
}

View File

@ -1138,6 +1138,7 @@ async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver<ipc:
)
))]
let mut enable_file_transfer = "".to_owned();
let is_cm = crate::common::is_cm();
loop {
if let Ok(mut c) = ipc::connect(1000, "").await {
@ -1148,6 +1149,9 @@ async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver<ipc:
match res {
Err(err) => {
log::error!("ipc connection closed: {}", err);
if is_cm {
crate::ui_cm_interface::quit_cm();
}
break;
}
#[cfg(not(any(target_os = "android", target_os = "ios")))]