summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2019-10-14 14:16:01 +0200
committerAram Drevekenin <aram@poor.dev>2019-10-14 14:16:01 +0200
commit09e5492889069a7ed94da00580fef77cd383637b (patch)
treea7180e85402b8b0d5dc9bcfc9a2555e7755d0cf6
parentf23d5b9bb709024dff4634220a2271a23ea38970 (diff)
fix(ui): atomic drawing
-rw-r--r--src/display/ui.rs39
1 files changed, 23 insertions, 16 deletions
diff --git a/src/display/ui.rs b/src/display/ui.rs
index e603601..8832de7 100644
--- a/src/display/ui.rs
+++ b/src/display/ui.rs
@@ -8,6 +8,7 @@ use crate::network::{Connection, Utilization};
use crate::display::components::{Table, Layout, TotalBandwidth};
use ::std::net::Ipv4Addr;
+use ::std::sync::atomic::{AtomicBool, Ordering};
pub struct Ui<B>
where
@@ -16,6 +17,7 @@ where
terminal: Terminal<B>,
state: UIState,
ip_to_host: HashMap<Ipv4Addr, String>,
+ drawing: AtomicBool,
}
impl<B> Ui<B>
@@ -30,25 +32,30 @@ where
terminal,
state: Default::default(),
ip_to_host: Default::default(),
+ drawing: AtomicBool::new(false),
}
}
pub fn draw(&mut self) {
- let state = &self.state;
- let ip_to_host = &self.ip_to_host;
- self.terminal
- .draw(|mut frame| {
- let size = frame.size();
- let connections = Table::create_connections_table(&state, &ip_to_host);
- let processes = Table::create_processes_table(&state);
- let remote_ips = Table::create_remote_ips_table(&state, &ip_to_host);
- let total_bandwidth = TotalBandwidth { state: &state };
- let layout = Layout {
- header: total_bandwidth,
- children: vec![connections, processes, remote_ips],
- };
- layout.render(&mut frame, size);
- })
- .unwrap();
+ if !self.drawing.load(Ordering::Acquire) {
+ self.drawing.store(true, Ordering::Release);
+ let state = &self.state;
+ let ip_to_host = &self.ip_to_host;
+ self.terminal
+ .draw(|mut frame| {
+ let size = frame.size();
+ let connections = Table::create_connections_table(&state, &ip_to_host);
+ let processes = Table::create_processes_table(&state);
+ let remote_ips = Table::create_remote_ips_table(&state, &ip_to_host);
+ let total_bandwidth = TotalBandwidth { state: &state };
+ let layout = Layout {
+ header: total_bandwidth,
+ children: vec![connections, processes, remote_ips],
+ };
+ layout.render(&mut frame, size);
+ })
+ .unwrap();
+ self.drawing.store(false, Ordering::Release);
+ }
}
pub fn update_state(
&mut self,