From 35d606eeb75eb9f9294b0a57d296ef99286082e8 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Mon, 12 Oct 2026 17:48:05 +0100 Subject: [PATCH] fix(main): Prevent re-entrant read lock deadlock during reload Reuse the already-held main_lock when checking module staleness in run() instead of re-acquiring server.mods.read(). --- src/main/mods.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/mods.rs b/src/main/mods.rs index 6140cc6e3..c0a945497 100644 --- a/src/main/mods.rs +++ b/src/main/mods.rs @@ -69,7 +69,7 @@ pub(crate) async fn run(server: &Arc, starts: bool) -> Result<(bool, boo let reloads = server.server.reloading.swap(false, Ordering::AcqRel); - let stops = !reloads || stale(server).await? <= restart_thresh(); + let stops = !reloads || stale_from_mods(&main_lock)? <= restart_thresh(); let starts = reloads && stops; if stops { let stop = main_mod.get::("stop")?; @@ -140,7 +140,10 @@ async fn stale_count(server: &Arc) -> usize { async fn stale(server: &Arc) -> Result { let mods_lock = server.mods.read().await; - let mods: &Vec = &mods_lock; + stale_from_mods(&mods_lock) +} + +fn stale_from_mods(mods: &[mods::Module]) -> Result { for (i, module) in mods.iter().enumerate() { if module.deleted()? { return Ok(i);