refactor(sysopt): replace Arc<TokioMutex> with AtomicBool for sysproxy state management

This commit is contained in:
Tunglies
2025-10-23 00:53:57 +08:00
parent 302677aed0
commit 9ea9704bbf

View File

@@ -7,16 +7,16 @@ use crate::{
utils::logging::Type, utils::logging::Type,
}; };
use anyhow::Result; use anyhow::Result;
use scopeguard::defer;
use smartstring::alias::String; use smartstring::alias::String;
use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering};
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
use sysproxy::{Autoproxy, Sysproxy}; use sysproxy::{Autoproxy, Sysproxy};
use tauri::async_runtime::Mutex as TokioMutex;
use tauri_plugin_autostart::ManagerExt; use tauri_plugin_autostart::ManagerExt;
pub struct Sysopt { pub struct Sysopt {
update_sysproxy: Arc<TokioMutex<bool>>, update_sysproxy: AtomicBool,
reset_sysproxy: Arc<TokioMutex<bool>>, reset_sysproxy: AtomicBool,
} }
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
@@ -84,8 +84,8 @@ async fn execute_sysproxy_command(args: Vec<std::string::String>) -> Result<()>
impl Default for Sysopt { impl Default for Sysopt {
fn default() -> Self { fn default() -> Self {
Sysopt { Sysopt {
update_sysproxy: Arc::new(TokioMutex::new(false)), update_sysproxy: AtomicBool::new(false),
reset_sysproxy: Arc::new(TokioMutex::new(false)), reset_sysproxy: AtomicBool::new(false),
} }
} }
} }
@@ -105,7 +105,16 @@ impl Sysopt {
/// init the sysproxy /// init the sysproxy
pub async fn update_sysproxy(&self) -> Result<()> { pub async fn update_sysproxy(&self) -> Result<()> {
let _lock = self.update_sysproxy.lock().await; if self
.update_sysproxy
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
.is_err()
{
return Ok(());
}
defer! {
self.update_sysproxy.store(false, Ordering::SeqCst);
}
let port = { let port = {
let verge_port = Config::verge().await.latest_ref().verge_mixed_port; let verge_port = Config::verge().await.latest_ref().verge_mixed_port;
@@ -192,13 +201,23 @@ impl Sysopt {
} }
let proxy_manager = EventDrivenProxyManager::global(); let proxy_manager = EventDrivenProxyManager::global();
proxy_manager.notify_config_changed(); proxy_manager.notify_config_changed();
Ok(()) Ok(())
} }
/// reset the sysproxy /// reset the sysproxy
#[allow(clippy::unused_async)]
pub async fn reset_sysproxy(&self) -> Result<()> { pub async fn reset_sysproxy(&self) -> Result<()> {
let _lock = self.reset_sysproxy.lock().await; if self
.reset_sysproxy
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
.is_err()
{
return Ok(());
}
defer! {
self.reset_sysproxy.store(false, Ordering::SeqCst);
}
//直接关闭所有代理 //直接关闭所有代理
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
{ {