From a280ee90af0749ce18d6d0b00939b06473717bc9 Mon Sep 17 00:00:00 2001 From: "Ngo Iok Ui (Wu Yu Wei)" Date: Wed, 30 Jun 2021 21:38:22 +0800 Subject: [PATCH] Fix high cpu usage on mac, fix #2074 (#2125) Co-authored-by: Lucas Nogueira --- .changes/mac-cpu.md | 6 ++++++ core/tauri-runtime-wry/src/lib.rs | 36 +++++++++++++++++-------------- 2 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 .changes/mac-cpu.md diff --git a/.changes/mac-cpu.md b/.changes/mac-cpu.md new file mode 100644 index 00000000000..bf1935d75a2 --- /dev/null +++ b/.changes/mac-cpu.md @@ -0,0 +1,6 @@ +--- +"tauri-runtime-wry": patch +"tauri": patch +--- + + Fix macOS high CPU usage. diff --git a/core/tauri-runtime-wry/src/lib.rs b/core/tauri-runtime-wry/src/lib.rs index 66843ea6ac1..a09d88c4888 100644 --- a/core/tauri-runtime-wry/src/lib.rs +++ b/core/tauri-runtime-wry/src/lib.rs @@ -131,7 +131,7 @@ unsafe impl Send for GlobalShortcutWrapper {} #[derive(Clone)] pub struct GlobalShortcutManagerHandle { context: EventLoopContext, - shortcuts: HashMap, + shortcuts: Arc>>, listeners: GlobalShortcutListeners, } @@ -159,7 +159,11 @@ impl GlobalShortcutManager for GlobalShortcutManagerHandle { )?; self.listeners.lock().unwrap().insert(id, Box::new(handler)); - self.shortcuts.insert(accelerator.into(), (id, shortcut)); + self + .shortcuts + .lock() + .unwrap() + .insert(accelerator.into(), (id, shortcut)); Ok(()) } @@ -172,12 +176,12 @@ impl GlobalShortcutManager for GlobalShortcutManagerHandle { Message::GlobalShortcut(GlobalShortcutMessage::UnregisterAll(tx)) )?; self.listeners.lock().unwrap().clear(); - self.shortcuts.clear(); + self.shortcuts.lock().unwrap().clear(); Ok(()) } fn unregister(&mut self, accelerator: &str) -> Result<()> { - if let Some((accelerator_id, shortcut)) = self.shortcuts.remove(accelerator) { + if let Some((accelerator_id, shortcut)) = self.shortcuts.lock().unwrap().remove(accelerator) { let (tx, rx) = channel(); getter!( self, @@ -1373,14 +1377,14 @@ impl Runtime for Wry { EventLoopIterationContext { callback: &callback, webviews: webviews.lock().expect("poisoned webview collection"), - window_event_listeners: window_event_listeners.clone(), + window_event_listeners: &window_event_listeners, global_shortcut_manager: global_shortcut_manager.clone(), - global_shortcut_manager_handle: global_shortcut_manager_handle.clone(), + global_shortcut_manager_handle: &global_shortcut_manager_handle, clipboard_manager: clipboard_manager.clone(), #[cfg(feature = "menu")] - menu_event_listeners: menu_event_listeners.clone(), + menu_event_listeners: &menu_event_listeners, #[cfg(feature = "system-tray")] - tray_context: tray_context.clone(), + tray_context: &tray_context, }, ); }); @@ -1409,14 +1413,14 @@ impl Runtime for Wry { EventLoopIterationContext { callback: &callback, webviews: webviews.lock().expect("poisoned webview collection"), - window_event_listeners: window_event_listeners.clone(), + window_event_listeners: &window_event_listeners, global_shortcut_manager: global_shortcut_manager.clone(), - global_shortcut_manager_handle: global_shortcut_manager_handle.clone(), + global_shortcut_manager_handle: &global_shortcut_manager_handle, clipboard_manager: clipboard_manager.clone(), #[cfg(feature = "menu")] - menu_event_listeners: menu_event_listeners.clone(), + menu_event_listeners: &menu_event_listeners, #[cfg(feature = "system-tray")] - tray_context: tray_context.clone(), + tray_context: &tray_context, }, ); }) @@ -1426,14 +1430,14 @@ impl Runtime for Wry { struct EventLoopIterationContext<'a> { callback: &'a (dyn Fn(RunEvent) + 'static), webviews: MutexGuard<'a, HashMap>, - window_event_listeners: WindowEventListeners, + window_event_listeners: &'a WindowEventListeners, global_shortcut_manager: Arc>, - global_shortcut_manager_handle: GlobalShortcutManagerHandle, + global_shortcut_manager_handle: &'a GlobalShortcutManagerHandle, clipboard_manager: Arc>, #[cfg(feature = "menu")] - menu_event_listeners: MenuEventListeners, + menu_event_listeners: &'a MenuEventListeners, #[cfg(feature = "system-tray")] - tray_context: TrayContext, + tray_context: &'a TrayContext, } fn handle_event_loop(