mirror of
https://github.com/wez/wezterm.git
synced 2024-12-23 13:21:38 +03:00
change mux empty poll to mux empty event
As part of reducing the amount of regularly scheduled stuff wezterm does in the background, this commit restructures how an empty mux is detected; now when the mux prunes dead windows it will emit an Empty event. The Activity type will now schedule a prune when it is dropped, which will clean up and trigger the Empty event. refs: https://github.com/wez/wezterm/issues/770
This commit is contained in:
parent
7cd9f32494
commit
1cbaf55640
@ -1,4 +1,5 @@
|
|||||||
//! Keeps track of the number of user-initiated activities
|
//! Keeps track of the number of user-initiated activities
|
||||||
|
use crate::Mux;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
|
||||||
static COUNT: AtomicUsize = AtomicUsize::new(0);
|
static COUNT: AtomicUsize = AtomicUsize::new(0);
|
||||||
@ -25,5 +26,11 @@ impl Activity {
|
|||||||
impl Drop for Activity {
|
impl Drop for Activity {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
COUNT.fetch_sub(1, Ordering::SeqCst);
|
COUNT.fetch_sub(1, Ordering::SeqCst);
|
||||||
|
|
||||||
|
promise::spawn::spawn_into_main_thread(async move {
|
||||||
|
let mux = Mux::get().unwrap();
|
||||||
|
mux.prune_dead_windows();
|
||||||
|
})
|
||||||
|
.detach();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ pub enum MuxNotification {
|
|||||||
pane_id: PaneId,
|
pane_id: PaneId,
|
||||||
alert: wezterm_term::Alert,
|
alert: wezterm_term::Alert,
|
||||||
},
|
},
|
||||||
|
Empty,
|
||||||
}
|
}
|
||||||
|
|
||||||
static SUB_ID: AtomicUsize = AtomicUsize::new(0);
|
static SUB_ID: AtomicUsize = AtomicUsize::new(0);
|
||||||
@ -184,6 +185,11 @@ fn read_from_pane_pty(pane_id: PaneId, banner: Option<String>, mut reader: Box<d
|
|||||||
// We don't know if we can unilaterally close
|
// We don't know if we can unilaterally close
|
||||||
// this pane right now, so don't!
|
// this pane right now, so don't!
|
||||||
state.write(b"\n[Process completed]");
|
state.write(b"\n[Process completed]");
|
||||||
|
promise::spawn::spawn_into_main_thread(async move {
|
||||||
|
let mux = Mux::get().unwrap();
|
||||||
|
mux.prune_dead_windows();
|
||||||
|
})
|
||||||
|
.detach();
|
||||||
}
|
}
|
||||||
ExitBehavior::Close => {
|
ExitBehavior::Close => {
|
||||||
promise::spawn::spawn_into_main_thread(async move {
|
promise::spawn::spawn_into_main_thread(async move {
|
||||||
@ -454,6 +460,10 @@ impl Mux {
|
|||||||
log::trace!("window {} is dead", window_id);
|
log::trace!("window {} is dead", window_id);
|
||||||
self.remove_window_internal(window_id);
|
self.remove_window_internal(window_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.is_empty() {
|
||||||
|
self.notify(MuxNotification::Empty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn kill_window(&self, window_id: WindowId) {
|
pub fn kill_window(&self, window_id: WindowId) {
|
||||||
|
@ -66,6 +66,12 @@ impl GuiFrontEnd {
|
|||||||
pane_id: _,
|
pane_id: _,
|
||||||
alert: Alert::TitleMaybeChanged,
|
alert: Alert::TitleMaybeChanged,
|
||||||
} => {}
|
} => {}
|
||||||
|
MuxNotification::Empty => {
|
||||||
|
if mux::activity::Activity::count() == 0 {
|
||||||
|
log::trace!("Mux is now empty, terminate gui");
|
||||||
|
Connection::get().unwrap().terminate_message_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
@ -76,17 +82,6 @@ impl GuiFrontEnd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_forever(&self) -> anyhow::Result<()> {
|
pub fn run_forever(&self) -> anyhow::Result<()> {
|
||||||
self.connection
|
|
||||||
.schedule_timer(std::time::Duration::from_millis(200), move || {
|
|
||||||
if mux::activity::Activity::count() == 0 {
|
|
||||||
let mux = Mux::get().unwrap();
|
|
||||||
mux.prune_dead_windows();
|
|
||||||
if mux.is_empty() {
|
|
||||||
Connection::get().unwrap().terminate_message_loop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
self.connection.run_message_loop()
|
self.connection.run_message_loop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,7 @@ where
|
|||||||
handler.schedule_pane_push(pane_id);
|
handler.schedule_pane_push(pane_id);
|
||||||
}
|
}
|
||||||
Ok(Item::Notif(MuxNotification::WindowCreated(_window_id))) => {}
|
Ok(Item::Notif(MuxNotification::WindowCreated(_window_id))) => {}
|
||||||
|
Ok(Item::Notif(MuxNotification::Empty)) => {}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("process_async Err {}", err);
|
log::error!("process_async Err {}", err);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
Loading…
Reference in New Issue
Block a user