summaryrefslogtreecommitdiff
path: root/src/managers/eventLoop/EventLoopManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/managers/eventLoop/EventLoopManager.cpp')
-rw-r--r--src/managers/eventLoop/EventLoopManager.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp
index 496cbb83..9933edf6 100644
--- a/src/managers/eventLoop/EventLoopManager.cpp
+++ b/src/managers/eventLoop/EventLoopManager.cpp
@@ -58,6 +58,7 @@ static int configWatcherWrite(int fd, uint32_t mask, void* data) {
static int handleWaiterFD(int fd, uint32_t mask, void* data) {
if (mask & (WL_EVENT_HANGUP | WL_EVENT_ERROR)) {
Log::logger->log(Log::ERR, "handleWaiterFD: readable waiter error");
+ g_pEventLoopManager->onFdReadableFail(sc<CEventLoopManager::SReadableWaiter*>(data));
return 0;
}
@@ -81,6 +82,16 @@ void CEventLoopManager::onFdReadable(SReadableWaiter* waiter) {
taken->fn();
}
+void CEventLoopManager::onFdReadableFail(SReadableWaiter* waiter) {
+ auto it = std::ranges::find_if(m_readableWaiters, [waiter](const UP<SReadableWaiter>& w) { return waiter == w.get() && w->fd == waiter->fd && w->source == waiter->source; });
+
+ // ???
+ if (it == m_readableWaiters.end())
+ return;
+
+ m_readableWaiters.erase(it);
+}
+
void CEventLoopManager::enterLoop() {
m_wayland.eventSource = wl_event_loop_add_fd(m_wayland.loop, m_timers.timerfd.get(), WL_EVENT_READABLE, timerWrite, nullptr);