fix(core): deadlocks on previous commit

This commit is contained in:
Lucas Nogueira 2021-09-26 01:48:13 -03:00
parent 2812c4464b
commit 63ae30f187
No known key found for this signature in database
GPG Key ID: 2714B66BCFB01F7F

View File

@ -1888,8 +1888,11 @@ fn handle_user_message(
match message {
Message::Task(task) => task(),
Message::Window(id, window_message) => {
let mut windows = windows.lock().expect("poisoned webview collection");
if let Some(webview) = windows.get_mut(&id) {
if let Some(webview) = windows
.lock()
.expect("poisoned webview collection")
.get_mut(&id)
{
let window = webview.inner.window();
match window_message {
// Getters
@ -1961,7 +1964,7 @@ fn handle_user_message(
on_window_close(
callback,
id,
&mut windows,
windows.lock().expect("poisoned webview collection"),
control_flow,
#[cfg(target_os = "linux")]
window_event_listeners,
@ -2314,11 +2317,13 @@ fn handle_event_loop(
}
match event {
WryWindowEvent::CloseRequested => {
let mut windows = windows.lock().expect("poisoned webview collection");
let (tx, rx) = channel();
if let Some(w) = windows.get(&window_id) {
let windows_guard = windows.lock().expect("poisoned webview collection");
if let Some(w) = windows_guard.get(&window_id) {
let label = w.label.clone();
drop(windows_guard);
callback(RunEvent::CloseRequested {
label: w.label.clone(),
label,
signal_tx: tx,
});
if let Ok(true) = rx.try_recv() {
@ -2326,7 +2331,7 @@ fn handle_event_loop(
on_window_close(
callback,
window_id,
&mut windows,
windows.lock().expect("poisoned webview collection"),
control_flow,
#[cfg(target_os = "linux")]
window_event_listeners,
@ -2380,16 +2385,18 @@ fn handle_event_loop(
fn on_window_close<'a>(
callback: &'a (dyn Fn(RunEvent) + 'static),
window_id: WindowId,
windows: &mut MutexGuard<'a, HashMap<WindowId, WindowWrapper>>,
mut windows: MutexGuard<'a, HashMap<WindowId, WindowWrapper>>,
control_flow: &mut ControlFlow,
#[cfg(target_os = "linux")] window_event_listeners: &WindowEventListeners,
menu_event_listeners: MenuEventListeners,
) {
if let Some(webview) = windows.remove(&window_id) {
let is_empty = windows.is_empty();
drop(windows);
menu_event_listeners.lock().unwrap().remove(&window_id);
callback(RunEvent::WindowClose(webview.label.clone()));
if windows.is_empty() {
if is_empty {
let (tx, rx) = channel();
callback(RunEvent::ExitRequested {
window_label: webview.label,