use crossbeam_utils::Backoff;
use std::sync::Arc;
use std::time::{Duration, Instant};
const MAX_WAIT: Duration = Duration::from_secs(10);
pub fn unwrap_arc<T>(mut arc: Arc<T>) -> Result<T, Arc<T>> {
let mut backoff = None::<Backoff>;
let mut start = None::<Instant>;
loop {
arc = match std::sync::Arc::try_unwrap(arc) {
Ok(inner) => {
return Ok(inner);
}
Err(arc) if start.is_none() => {
let _ = start.insert(Instant::now());
arc
}
Err(arc) if Instant::now() - start.unwrap() > MAX_WAIT => return Err(arc),
Err(arc) => {
backoff.get_or_insert_with(Backoff::new).spin();
arc
}
};
}
}