LibLine: Handle read events serially

Previously LibLine accepted read callbacks while it was in the process
of reading input, this wasn't an issue as no async code was being
executed up until the Shell autocompletion came along.
Simply defer input processing while processing input to avoid causing
problems.
Fixes #13280.
This commit is contained in:
Ali Mohammad Pur 2022-03-27 22:52:31 +04:30 committed by Andreas Kling
parent 5e541aaebd
commit f6afb70b07
Notes: sideshowbarker 2024-07-17 16:39:13 +09:00
2 changed files with 23 additions and 0 deletions

View File

@ -791,6 +791,13 @@ void Editor::handle_interrupt_event()
void Editor::handle_read_event()
{
if (m_prohibit_input_processing) {
m_have_unprocessed_read_event = true;
return;
}
auto prohibit_scope = prohibit_input();
char keybuf[16];
ssize_t nread = 0;

View File

@ -241,6 +241,20 @@ public:
const Utf32View buffer_view() const { return { m_buffer.data(), m_buffer.size() }; }
auto prohibit_input()
{
auto previous_value = m_prohibit_input_processing;
m_prohibit_input_processing = true;
m_have_unprocessed_read_event = false;
return ScopeGuard {
[this, previous_value] {
m_prohibit_input_processing = previous_value;
if (!m_prohibit_input_processing && m_have_unprocessed_read_event)
handle_read_event();
}
};
}
private:
explicit Editor(Configuration configuration = Configuration::from_config());
@ -500,6 +514,8 @@ private:
Vector<int, 2> m_signal_handlers;
bool m_is_editing { false };
bool m_prohibit_input_processing { false };
bool m_have_unprocessed_read_event { false };
Configuration m_configuration;
};