fix(plugins): handle race when setting plugin selectable (#3651)

This commit is contained in:
Aram Drevekenin 2024-10-09 08:08:29 +02:00 committed by GitHub
parent 2aca07d74c
commit 06a98fd971
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2710,6 +2710,7 @@ pub(crate) fn screen_thread_main(
let mut pending_tab_ids: HashSet<usize> = HashSet::new(); let mut pending_tab_ids: HashSet<usize> = HashSet::new();
let mut pending_tab_switches: HashSet<(usize, ClientId)> = HashSet::new(); // usize is the let mut pending_tab_switches: HashSet<(usize, ClientId)> = HashSet::new(); // usize is the
// tab_index // tab_index
let mut pending_events_waiting_for_tab: Vec<ScreenInstruction> = vec![];
let mut pending_events_waiting_for_client: Vec<ScreenInstruction> = vec![]; let mut pending_events_waiting_for_client: Vec<ScreenInstruction> = vec![];
let mut plugin_loading_message_cache = HashMap::new(); let mut plugin_loading_message_cache = HashMap::new();
loop { loop {
@ -3299,12 +3300,18 @@ pub(crate) fn screen_thread_main(
}, },
ScreenInstruction::SetSelectable(pid, selectable) => { ScreenInstruction::SetSelectable(pid, selectable) => {
let all_tabs = screen.get_tabs_mut(); let all_tabs = screen.get_tabs_mut();
let mut found_plugin = false;
for tab in all_tabs.values_mut() { for tab in all_tabs.values_mut() {
if tab.has_pane_with_pid(&pid) { if tab.has_pane_with_pid(&pid) {
tab.set_pane_selectable(pid, selectable); tab.set_pane_selectable(pid, selectable);
found_plugin = true;
break; break;
} }
} }
if !found_plugin {
pending_events_waiting_for_tab
.push(ScreenInstruction::SetSelectable(pid, selectable));
}
screen.render(None)?; screen.render(None)?;
screen.log_and_report_session_state()?; screen.log_and_report_session_state()?;
}, },
@ -3505,6 +3512,10 @@ pub(crate) fn screen_thread_main(
screen.bus.senders.send_to_screen(event).non_fatal(); screen.bus.senders.send_to_screen(event).non_fatal();
} }
for event in pending_events_waiting_for_tab.drain(..) {
screen.bus.senders.send_to_screen(event).non_fatal();
}
screen.unblock_input()?; screen.unblock_input()?;
screen.render(None)?; screen.render(None)?;
// we do this here in order to recover from a race condition on app start // we do this here in order to recover from a race condition on app start