use std::sync::Arc;
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
use std::thread::JoinHandle;
pub(crate) fn abort_and_join(
search_abort: &mut Option<Arc<AtomicBool>>,
search_handle: &mut Option<JoinHandle<()>>,
) {
if let Some(abort) = search_abort.take() {
abort.store(true, Ordering::Relaxed);
}
if let Some(handle) = search_handle.take() {
handle.join().ok();
}
}
pub(crate) fn invalidate_and_join(
search_generation: &AtomicU64,
search_abort: &mut Option<Arc<AtomicBool>>,
search_handle: &mut Option<JoinHandle<()>>,
) {
search_generation.fetch_add(1, Ordering::AcqRel);
abort_and_join(search_abort, search_handle);
}
pub(crate) fn mutate_after_join<T>(
search_abort: &mut Option<Arc<AtomicBool>>,
search_handle: &mut Option<JoinHandle<()>>,
mutate: impl FnOnce() -> T,
) -> T {
abort_and_join(search_abort, search_handle);
mutate()
}