summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-06-03 12:04:55 +1000
committerMaxime Coste <mawww@kakoune.org>2018-06-03 12:17:38 +1000
commit56e5322b452ada676ca03884d7e813f42e007013 (patch)
tree8e25f8052a8f335661b47af9ac0a8e8638e7ae7f /src
parentc63502c7c6f6e013351edf2b78335cfbb8475f14 (diff)
EventManager: Never block if a forced file descriptor is present
Diffstat (limited to 'src')
-rw-r--r--src/event_manager.cc5
-rw-r--r--src/event_manager.hh1
2 files changed, 6 insertions, 0 deletions
diff --git a/src/event_manager.cc b/src/event_manager.cc
index eed7614f..0767473a 100644
--- a/src/event_manager.cc
+++ b/src/event_manager.cc
@@ -91,6 +91,9 @@ bool EventManager::handle_next_events(EventMode mode, sigset_t* sigmask, bool bl
}
bool with_timeout = false;
+ if (m_has_forced_fd)
+ block = false;
+
timespec ts{};
if (block and not m_timers.empty())
{
@@ -113,6 +116,7 @@ bool EventManager::handle_next_events(EventMode mode, sigset_t* sigmask, bool bl
// copy forced fds *after* select, so that signal handlers can write to
// m_forced_fd, interupt select, and directly be serviced.
+ m_has_forced_fd = false;
fd_set forced = m_forced_fd;
FD_ZERO(&m_forced_fd);
@@ -147,6 +151,7 @@ bool EventManager::handle_next_events(EventMode mode, sigset_t* sigmask, bool bl
void EventManager::force_signal(int fd)
{
FD_SET(fd, &m_forced_fd);
+ m_has_forced_fd = true;
}
SignalHandler set_signal_handler(int signum, SignalHandler handler)
diff --git a/src/event_manager.hh b/src/event_manager.hh
index 91a8d41c..f4bece31 100644
--- a/src/event_manager.hh
+++ b/src/event_manager.hh
@@ -98,6 +98,7 @@ private:
Vector<FDWatcher*, MemoryDomain::Events> m_fd_watchers;
Vector<Timer*, MemoryDomain::Events> m_timers;
fd_set m_forced_fd;
+ bool m_has_forced_fd = false;
TimePoint m_last;
};