mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
trying to fix locking performance
This commit is contained in:
parent
2f09e3230a
commit
60acb20a57
1 changed files with 51 additions and 50 deletions
|
|
@ -60,21 +60,32 @@ impl Tui {
|
||||||
) -> Usually<Arc<RwLock<R>>> {
|
) -> Usually<Arc<RwLock<R>>> {
|
||||||
let backend = CrosstermBackend::new(stdout());
|
let backend = CrosstermBackend::new(stdout());
|
||||||
let area = backend.size()?;
|
let area = backend.size()?;
|
||||||
let mut engine = Self {
|
let engine = Self {
|
||||||
exited: Arc::new(AtomicBool::new(false)),
|
exited: Arc::new(AtomicBool::new(false)),
|
||||||
event: RwLock::new(None),
|
event: RwLock::new(None),
|
||||||
buffer: 0,
|
buffer: 0,
|
||||||
buffers: [Buffer::empty(area), Buffer::empty(area)],
|
buffers: [Buffer::empty(area), Buffer::empty(area)],
|
||||||
backend,
|
|
||||||
area: area.xywh(),
|
area: area.xywh(),
|
||||||
|
backend,
|
||||||
};
|
};
|
||||||
engine.setup()?;
|
|
||||||
let engine = Arc::new(RwLock::new(engine));
|
let engine = Arc::new(RwLock::new(engine));
|
||||||
let _input_thread = {
|
let _input_thread = Self::spawn_input_thread(&engine, &state, Duration::from_millis(100));
|
||||||
|
engine.write().unwrap().setup()?;
|
||||||
|
let render_thread = Self::spawn_render_thread(&engine, &state, Duration::from_millis(20));
|
||||||
|
render_thread.join().expect("main thread failed");
|
||||||
|
engine.write().unwrap().teardown()?;
|
||||||
|
Ok(state)
|
||||||
|
}
|
||||||
|
fn spawn_input_thread <R: Component<Tui> + Sized + 'static> (
|
||||||
|
engine: &Arc<RwLock<Self>>, state: &Arc<RwLock<R>>, poll: Duration
|
||||||
|
) -> JoinHandle<()> {
|
||||||
|
let exited = engine.read().unwrap().exited.clone();
|
||||||
let engine = engine.clone();
|
let engine = engine.clone();
|
||||||
let state = state.clone();
|
let state = state.clone();
|
||||||
let poll = Duration::from_millis(100);
|
|
||||||
spawn(move || loop {
|
spawn(move || loop {
|
||||||
|
if exited.fetch_and(true, Ordering::Relaxed) {
|
||||||
|
break
|
||||||
|
}
|
||||||
if ::crossterm::event::poll(poll).is_ok() {
|
if ::crossterm::event::poll(poll).is_ok() {
|
||||||
let event = TuiEvent::Input(::crossterm::event::read().unwrap());
|
let event = TuiEvent::Input(::crossterm::event::read().unwrap());
|
||||||
match event {
|
match event {
|
||||||
|
|
@ -89,37 +100,27 @@ impl Tui {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if engine.read().unwrap().exited() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
//engine.read().unwrap().handle(&mut *state.write().unwrap()).expect("handle failed");
|
//engine.read().unwrap().handle(&mut *state.write().unwrap()).expect("handle failed");
|
||||||
})
|
})
|
||||||
};
|
}
|
||||||
let main_thread = {
|
fn spawn_render_thread <R: Component<Tui> + Sized + 'static> (
|
||||||
|
engine: &Arc<RwLock<Self>>, state: &Arc<RwLock<R>>, sleep: Duration
|
||||||
|
) -> JoinHandle<()> {
|
||||||
|
let exited = engine.read().unwrap().exited.clone();
|
||||||
let engine = engine.clone();
|
let engine = engine.clone();
|
||||||
let state = state.clone();
|
let state = state.clone();
|
||||||
let sleep = Duration::from_millis(20);
|
|
||||||
spawn(move || loop {
|
spawn(move || loop {
|
||||||
let size = {
|
if exited.fetch_and(true, Ordering::Relaxed) {
|
||||||
let engine = engine.read().unwrap();
|
|
||||||
if engine.exited() {
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
engine.backend.size().expect("get size failed").xywh()
|
if let Ok(state) = state.try_read() {
|
||||||
};
|
|
||||||
{
|
|
||||||
let mut engine = engine.write().unwrap();
|
let mut engine = engine.write().unwrap();
|
||||||
engine.area = size;
|
engine.area = engine.backend.size().expect("get size failed").xywh();
|
||||||
state.read().unwrap().render(&mut engine).expect("render failed");
|
state.render(&mut engine).expect("render failed");
|
||||||
engine.flip();
|
engine.flip();
|
||||||
std::mem::drop(engine);
|
|
||||||
}
|
}
|
||||||
std::thread::sleep(sleep);
|
std::thread::sleep(sleep);
|
||||||
})
|
})
|
||||||
};
|
|
||||||
main_thread.join().expect("main thread failed");
|
|
||||||
engine.write().unwrap().teardown()?;
|
|
||||||
Ok(state)
|
|
||||||
}
|
}
|
||||||
pub fn event (&self) -> TuiEvent {
|
pub fn event (&self) -> TuiEvent {
|
||||||
self.event.read().unwrap().clone().unwrap()
|
self.event.read().unwrap().clone().unwrap()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue