From 80086b9a8b094452bb4bcec2a832a362208f42c8 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 6 Sep 2024 00:34:26 +0300 Subject: [PATCH] okay now it does not deadlock --- crates/tek_core/Cargo.toml | 1 + crates/tek_core/src/jack_core.rs | 3 +- crates/tek_core/src/tui.rs | 64 +++++++++++++-------------- crates/tek_mixer/Cargo.toml | 2 +- crates/tek_sequencer/src/transport.rs | 2 +- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/crates/tek_core/Cargo.toml b/crates/tek_core/Cargo.toml index 36c5632e..ea5e247d 100644 --- a/crates/tek_core/Cargo.toml +++ b/crates/tek_core/Cargo.toml @@ -15,3 +15,4 @@ midly = "0.5" once_cell = "1.19.0" ratatui = { version = "0.26.3", features = [ "unstable-widget-ref", "underline-color" ] } toml = "0.8.12" +#no_deadlocks = "1.3.2" diff --git a/crates/tek_core/src/jack_core.rs b/crates/tek_core/src/jack_core.rs index a742722d..4b0a0738 100644 --- a/crates/tek_core/src/jack_core.rs +++ b/crates/tek_core/src/jack_core.rs @@ -1,4 +1,5 @@ -use crate::{*, jack::*}; +use jack::*; +use crate::*; /// A UI component that may be associated with a JACK client by the `Jack` factory. pub trait Device: Component + Process { diff --git a/crates/tek_core/src/tui.rs b/crates/tek_core/src/tui.rs index 79649fa5..e3b7e57f 100644 --- a/crates/tek_core/src/tui.rs +++ b/crates/tek_core/src/tui.rs @@ -17,8 +17,6 @@ pub struct Tui { backend: CrosstermBackend, event: RwLock>, area: Rect, - sleep: Duration, - poll: Duration, } impl Engine for Tui { type HandleInput = Self; @@ -42,26 +40,10 @@ impl Engine for Tui { stdout().execute(LeaveAlternateScreen)?; disable_raw_mode().map_err(Into::into) } - fn handle (&self, state: &mut impl Handle) -> Usually<()> { - if ::crossterm::event::poll(self.poll).is_ok() { - let event = ::crossterm::event::read().unwrap(); - if let Event::Key(KeyEvent { - code: KeyCode::Char('c'), modifiers: KeyModifiers::CONTROL, .. - }) = event { - self.exited.store(true, Ordering::Relaxed); - } else { - *self.event.write().unwrap() = Some(TuiEvent::Input(event)); - let result = state.handle(self); - if let Err(e) = result { - panic!("{e}") - } - } - } + fn handle (&self, _: &mut impl Handle) -> Usually<()> { Ok(()) } - fn render (&mut self, state: &impl Render) -> Usually<()> { - state.render(self).expect("render failed"); - self.flip(); + fn render (&mut self, _: &impl Render) -> Usually<()> { Ok(()) } } @@ -72,42 +54,58 @@ impl Tui { ) -> Usually>> { let backend = CrosstermBackend::new(stdout()); let area = backend.size()?; - let engine = Arc::new(RwLock::new(Self { - sleep: Duration::from_millis(20), - poll: Duration::from_millis(100), + let mut engine = Self { exited: Arc::new(AtomicBool::new(false)), event: RwLock::new(None), buffer: 0, buffers: [Buffer::empty(area), Buffer::empty(area)], backend, area, - })); + }; + engine.setup()?; + let engine = Arc::new(RwLock::new(engine)); let _input_thread = { let engine = engine.clone(); let state = state.clone(); + let poll = Duration::from_millis(100); spawn(move || loop { - let engine = engine.read().unwrap(); - if engine.exited() { + if ::crossterm::event::poll(poll).is_ok() { + let event = TuiEvent::Input(::crossterm::event::read().unwrap()); + match event { + key!(Ctrl-KeyCode::Char('c')) => { + engine.write().unwrap().exited.store(true, Ordering::Relaxed); + }, + _ => { + *engine.write().unwrap().event.write().unwrap() = Some(event); + if let Err(e) = state.write().unwrap().handle(&*engine.read().unwrap()) { + panic!("{e}") + } + } + } + } + if engine.read().unwrap().exited() { break } - engine.handle(&mut *state.write().unwrap()).expect("handle failed"); + //engine.read().unwrap().handle(&mut *state.write().unwrap()).expect("handle failed"); }) }; let main_thread = { let engine = engine.clone(); let state = state.clone(); + let sleep = Duration::from_millis(20); spawn(move || loop { - let mut engine = engine.write().unwrap(); - if engine.exited() { - break - } - if let Ok(state) = state.try_read() { + if let (Ok(mut engine), Ok(state)) = (engine.write(), state.try_read()) { + if engine.exited() { + break + } engine.render(&*state).expect("render failed"); + engine.flip(); } - std::thread::sleep(engine.sleep); + std::thread::sleep(sleep); }) }; main_thread.join().expect("main thread failed"); + engine.write().unwrap().teardown()?; Ok(state) } pub fn event (&self) -> TuiEvent { diff --git a/crates/tek_mixer/Cargo.toml b/crates/tek_mixer/Cargo.toml index 65472614..de12ce65 100644 --- a/crates/tek_mixer/Cargo.toml +++ b/crates/tek_mixer/Cargo.toml @@ -32,4 +32,4 @@ path = "src/sampler_main.rs" [[bin]] name = "tek_plugin" -path = "src/sampler_main.rs" +path = "src/plugin_main.rs" diff --git a/crates/tek_sequencer/src/transport.rs b/crates/tek_sequencer/src/transport.rs index fad28eff..9f35602e 100644 --- a/crates/tek_sequencer/src/transport.rs +++ b/crates/tek_sequencer/src/transport.rs @@ -34,7 +34,7 @@ impl TransportToolbar { transport.write().unwrap().jack = Some( jack.activate( &transport.clone(), - |state, client, scope| { + |state: &Arc>, client, scope| { state.write().unwrap().process(client, scope) } )?