#![allow(clippy::mutex_atomic)] use std::sync::{Arc, Condvar, Mutex}; #[derive(Clone)] pub(crate) struct CommandIsExecuting { input_thread: Arc<(Mutex, Condvar)>, } impl CommandIsExecuting { pub fn new() -> Self { CommandIsExecuting { input_thread: Arc::new((Mutex::new(false), Condvar::new())), } } pub fn blocking_input_thread(&mut self) { let (lock, _cvar) = &*self.input_thread; let mut input_thread = lock.lock().unwrap(); *input_thread = true; } pub fn unblock_input_thread(&mut self) { let (lock, cvar) = &*self.input_thread; let mut input_thread = lock.lock().unwrap(); *input_thread = false; cvar.notify_all(); } pub fn wait_until_input_thread_is_unblocked(&self) { let (lock, cvar) = &*self.input_thread; let mut input_thread = lock.lock().unwrap(); while *input_thread { input_thread = cvar.wait(input_thread).unwrap(); } } }