use std::collections::HashSet;
use std::sync::{Mutex, OnceLock};
static IMPROVING: OnceLock<Mutex<HashSet<String>>> = OnceLock::new();
fn registry() -> &'static Mutex<HashSet<String>> {
IMPROVING.get_or_init(|| Mutex::new(HashSet::new()))
}
pub fn try_acquire_improve_lock(session_id: &str) -> bool {
if session_id.is_empty() {
return true;
}
#[allow(clippy::unwrap_used, reason = "lock poison is unrecoverable")]
let mut set = registry().lock().unwrap();
set.insert(session_id.to_string())
}
pub fn release_improve_lock(session_id: &str) {
if session_id.is_empty() {
return;
}
#[allow(clippy::unwrap_used, reason = "lock poison is unrecoverable")]
registry().lock().unwrap().remove(session_id);
}
pub struct ImproveLockGuard(Option<String>);
impl ImproveLockGuard {
pub fn acquire(session_id: &str) -> Option<Self> {
if try_acquire_improve_lock(session_id) {
Some(Self(Some(session_id.to_string())))
} else {
None
}
}
}
impl Drop for ImproveLockGuard {
fn drop(&mut self) {
if let Some(ref s) = self.0.take() {
release_improve_lock(s);
}
}
}
#[cfg(test)]
#[allow(
clippy::unwrap_used,
clippy::expect_used,
reason = "test code — panics are acceptable failures"
)]
mod tests {
use super::*;
#[test]
fn empty_session_id_always_acquires() {
assert!(try_acquire_improve_lock(""));
assert!(try_acquire_improve_lock(""));
release_improve_lock("");
}
#[test]
fn second_acquire_returns_false() {
let sid = format!("test-lock-second-{}", uuid::Uuid::new_v4());
assert!(try_acquire_improve_lock(&sid), "first acquire must succeed");
assert!(
!try_acquire_improve_lock(&sid),
"second acquire must fail while first is held"
);
release_improve_lock(&sid);
}
#[test]
fn improve_lock_excludes_concurrent() {
let sid = format!("test-lock-excl-{}", uuid::Uuid::new_v4());
assert!(try_acquire_improve_lock(&sid));
assert!(!try_acquire_improve_lock(&sid));
release_improve_lock(&sid);
assert!(try_acquire_improve_lock(&sid));
release_improve_lock(&sid);
}
#[test]
fn guard_releases_on_drop() {
let sid = format!("test-lock-guard-{}", uuid::Uuid::new_v4());
{
let guard = ImproveLockGuard::acquire(&sid);
assert!(guard.is_some(), "guard must be acquired");
assert!(!try_acquire_improve_lock(&sid));
} assert!(try_acquire_improve_lock(&sid));
release_improve_lock(&sid);
}
#[test]
fn guard_acquire_fails_when_held() {
let sid = format!("test-lock-guard-fail-{}", uuid::Uuid::new_v4());
let _g1 = ImproveLockGuard::acquire(&sid).expect("first guard");
let g2 = ImproveLockGuard::acquire(&sid);
assert!(g2.is_none(), "second guard must not be acquired");
}
#[test]
fn empty_session_id_guard_always_acquires() {
let g1 = ImproveLockGuard::acquire("");
assert!(g1.is_some());
let g2 = ImproveLockGuard::acquire("");
assert!(g2.is_some());
}
}