diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-06-03 12:04:55 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-06-03 12:17:38 +1000 |
| commit | 56e5322b452ada676ca03884d7e813f42e007013 (patch) | |
| tree | 8e25f8052a8f335661b47af9ac0a8e8638e7ae7f /src | |
| parent | c63502c7c6f6e013351edf2b78335cfbb8475f14 (diff) | |
EventManager: Never block if a forced file descriptor is present
Diffstat (limited to 'src')
| -rw-r--r-- | src/event_manager.cc | 5 | ||||
| -rw-r--r-- | src/event_manager.hh | 1 |
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; }; |
