From 2ea7ec9e7e2c2dc65b688d9ce296131c9663df05 Mon Sep 17 00:00:00 2001 From: ErrorNoInternet Date: Sun, 23 Feb 2025 02:49:35 -0500 Subject: [PATCH] fix(events): manipulate listeners in a task to avoid deadlocks --- src/lua/events.rs | 50 ++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/lua/events.rs b/src/lua/events.rs index 5b0e1c3..4dfdfd3 100644 --- a/src/lua/events.rs +++ b/src/lua/events.rs @@ -9,18 +9,19 @@ pub async fn register_functions(lua: &Lua, globals: &Table, state: State) -> Res "add_listener", lua.create_function( move |_, (event_type, callback, id): (String, Function, Option)| { - let mut l = block_on(l.lock()); - - l.entry(event_type).or_default().push(( - id.unwrap_or(callback.info().name.unwrap_or(format!( - "anonymous @ {}", - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_default() - .as_millis() - ))), - callback, - )); + let l = l.clone(); + tokio::spawn(async move { + l.lock().await.entry(event_type).or_default().push(( + id.unwrap_or(callback.info().name.unwrap_or(format!( + "anonymous @ {}", + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis() + ))), + callback, + )); + }); Ok(()) }, )?, @@ -30,18 +31,19 @@ pub async fn register_functions(lua: &Lua, globals: &Table, state: State) -> Res globals.set( "remove_listener", lua.create_function(move |_, (event_type, target_id): (String, String)| { - let mut l = block_on(l.lock()); - - let empty = if let Some(listeners) = l.get_mut(&event_type) { - listeners.retain(|(id, _)| target_id != *id); - listeners.is_empty() - } else { - false - }; - if empty { - l.remove(&event_type); - } - + let l = l.clone(); + tokio::spawn(async move { + let mut l = l.lock().await; + let empty = if let Some(listeners) = l.get_mut(&event_type) { + listeners.retain(|(id, _)| target_id != *id); + listeners.is_empty() + } else { + false + }; + if empty { + l.remove(&event_type); + } + }); Ok(()) })?, )?;