aboutsummaryrefslogtreecommitdiffstats
path: root/src/command_is_executing.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2020-11-19 18:24:34 +0100
committerGitHub <noreply@github.com>2020-11-19 18:24:34 +0100
commit429e415ecca4948563d6e5b81f7270a98963f6bb (patch)
tree3a9feb2d2fc0d31c86e75f1f8cc40d82b2bbd1ba /src/command_is_executing.rs
parentrefactor(data-structures): #51 change winsize to positionandsize (#56) (diff)
downloadsl0ppij-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.rs52
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();
+ }
+ }
+}