diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-10-22 16:15:48 +0100 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-10-22 16:15:52 +0100 |
| commit | 0d7d7a970dc047517ed4d3922c1da3638cb51aed (patch) | |
| tree | 08c51a602db2dd1cf1c51bf9132a1103937e962b /src/managers/EventManager.cpp | |
| parent | 3a27ef5e12f0336b0a4bfce0ba98be45f0f5ef51 (diff) | |
fix crash in event manager on hangup
Diffstat (limited to 'src/managers/EventManager.cpp')
| -rw-r--r-- | src/managers/EventManager.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/managers/EventManager.cpp b/src/managers/EventManager.cpp index b5bcf78a..fd579ac0 100644 --- a/src/managers/EventManager.cpp +++ b/src/managers/EventManager.cpp @@ -18,6 +18,23 @@ CEventManager::CEventManager() { } +int fdHandleWrite(int fd, uint32_t mask, void* data) { + if (mask & WL_EVENT_ERROR || mask & WL_EVENT_HANGUP) { + // remove, hanged up + const auto ACCEPTEDFDS = (std::deque<std::pair<int, wl_event_source*>>*)data; + for (auto it = ACCEPTEDFDS->begin(); it != ACCEPTEDFDS->end(); ) { + if (it->first == fd) { + wl_event_source_remove(it->second); // remove this fd listener + it = ACCEPTEDFDS->erase(it); + } else { + it++; + } + } + } + + return 0; +} + void CEventManager::startThread() { m_tThread = std::thread([&]() { const auto SOCKET = socket(AF_UNIX, SOCK_STREAM, 0); @@ -46,12 +63,14 @@ void CEventManager::startThread() { if (ACCEPTEDCONNECTION > 0) { // new connection! - m_dAcceptedSocketFDs.push_back(ACCEPTEDCONNECTION); int flagsNew = fcntl(ACCEPTEDCONNECTION, F_GETFL, 0); fcntl(ACCEPTEDCONNECTION, F_SETFL, flagsNew | O_NONBLOCK); Debug::log(LOG, "Socket 2 accepted a new client at FD %d", ACCEPTEDCONNECTION); + + // add to event loop so we can close it when we need to + m_dAcceptedSocketFDs.push_back({ACCEPTEDCONNECTION, wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, ACCEPTEDCONNECTION, WL_EVENT_READABLE, fdHandleWrite, &m_dAcceptedSocketFDs)}); } ensureFDsValid(); @@ -68,7 +87,7 @@ void CEventManager::ensureFDsValid() { // pong if all FDs valid for (auto it = m_dAcceptedSocketFDs.begin(); it != m_dAcceptedSocketFDs.end();) { - auto sizeRead = recv(*it, &readBuf, 1024, 0); + auto sizeRead = recv(it->first, &readBuf, 1024, 0); if (sizeRead != 0) { it++; @@ -90,7 +109,7 @@ void CEventManager::flushEvents() { for (auto& ev : m_dQueuedEvents) { std::string eventString = (ev.event + ">>" + ev.data).substr(0, 1022) + "\n"; for (auto& fd : m_dAcceptedSocketFDs) { - write(fd, eventString.c_str(), eventString.length()); + write(fd.first, eventString.c_str(), eventString.length()); } } |
