diff options
| author | Aram Drevekenin <aram@poor.dev> | 2020-11-19 18:24:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-19 18:24:34 +0100 |
| commit | 429e415ecca4948563d6e5b81f7270a98963f6bb (patch) | |
| tree | 3a9feb2d2fc0d31c86e75f1f8cc40d82b2bbd1ba /src/command_is_executing.rs | |
| parent | refactor(data-structures): #51 change winsize to positionandsize (#56) (diff) | |
| download | sl0ppij-429e415ecca4948563d6e5b81f7270a98963f6bb.tar.gz sl0ppij-429e415ecca4948563d6e5b81f7270a98963f6bb.tar.xz sl0ppij-429e415ecca4948563d6e5b81f7270a98963f6bb.zip | |
fix(atomicity): block commands before executing others (#59)
Diffstat (limited to 'src/command_is_executing.rs')
| -rw-r--r-- | src/command_is_executing.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/command_is_executing.rs b/src/command_is_executing.rs new file mode 100644 index 00000000..0cf47c05 --- /dev/null +++ b/src/command_is_executing.rs @@ -0,0 +1,52 @@ +use std::sync::{Arc, Condvar, Mutex}; + +#[derive(Clone)] +pub struct CommandIsExecuting { + opening_new_pane: Arc<(Mutex<bool>, Condvar)>, + closing_pane: Arc<(Mutex<bool>, Condvar)>, +} + +impl CommandIsExecuting { + pub fn new() -> Self { + CommandIsExecuting { + opening_new_pane: Arc::new((Mutex::new(false), Condvar::new())), + closing_pane: Arc::new((Mutex::new(false), Condvar::new())), + } + } + pub fn closing_pane(&mut self) { + let (lock, _cvar) = &*self.closing_pane; + let mut closing_pane = lock.lock().unwrap(); + *closing_pane = true; + } + pub fn done_closing_pane(&mut self) { + let (lock, cvar) = &*self.closing_pane; + let mut closing_pane = lock.lock().unwrap(); + *closing_pane = false; + cvar.notify_one(); + } + pub fn opening_new_pane(&mut self) { + let (lock, _cvar) = &*self.opening_new_pane; + let mut opening_new_pane = lock.lock().unwrap(); + *opening_new_pane = true; + } + pub fn done_opening_new_pane(&mut self) { + let (lock, cvar) = &*self.opening_new_pane; + let mut opening_new_pane = lock.lock().unwrap(); + *opening_new_pane = false; + cvar.notify_one(); + } + pub fn wait_until_pane_is_closed(&self) { + let (lock, cvar) = &*self.closing_pane; + let mut closing_pane = lock.lock().unwrap(); + while *closing_pane { + closing_pane = cvar.wait(closing_pane).unwrap(); + } + } + pub fn wait_until_new_pane_is_opened(&self) { + let (lock, cvar) = &*self.opening_new_pane; + let mut opening_new_pane = lock.lock().unwrap(); + while *opening_new_pane { + opening_new_pane = cvar.wait(opening_new_pane).unwrap(); + } + } +} |
