From 7b7dcb5a77061cb69d368de263a02b5ad26fbf51 Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 26 Oct 2026 04:20:52 +0100 Subject: unify lock logic --- src/swarm/relay.rs | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'src/swarm/relay.rs') diff --git a/src/swarm/relay.rs b/src/swarm/relay.rs index 703bc3f..5053be7 100644 --- a/src/swarm/relay.rs +++ b/src/swarm/relay.rs @@ -25,6 +25,7 @@ use std::time::Duration; use tokio::time::Instant; use tracing::debug; +use crate::locks::MutexExt; use crate::state::{AppState, Standing}; use crate::swarm::peer::send_ping; use crate::swarm::sync::SyncEvent; @@ -45,10 +46,7 @@ pub(crate) async fn announce(state: &AppState, from: &str) { return; } let schedule = { - let mut pending = state - .announce_pending - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()); + let mut pending = state.announce_pending.lock_or_recover(); match pending.as_mut() { Some(senders) => { senders.insert(from.to_owned()); @@ -68,8 +66,7 @@ pub(crate) async fn announce(state: &AppState, from: &str) { tokio::time::sleep(ANNOUNCE_DELAY).await; let senders = state .announce_pending - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()) + .lock_or_recover() .take() .unwrap_or_default(); announce_now(&state, &senders).await; @@ -128,10 +125,7 @@ pub(crate) async fn pull_if_behind(state: &AppState, peer: &str, remote: &transp let now = Instant::now(); { - let mut pulling = state - .pulling - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()); + let mut pulling = state.pulling.lock_or_recover(); let busy = matches!( &*pulling, Some((other, since)) if other != peer && now < *since + PULL_TIMEOUT @@ -169,10 +163,7 @@ pub(crate) async fn pull_if_behind(state: &AppState, peer: &str, remote: &transp /// A sync message from `peer` was applied: a pull from it is answered. pub(crate) fn pulled(state: &AppState, peer: &str) { - let mut pulling = state - .pulling - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()); + let mut pulling = state.pulling.lock_or_recover(); if pulling.as_ref().is_some_and(|(p, _)| p == peer) { *pulling = None; } -- cgit v1.3.1