summaryrefslogtreecommitdiff
path: root/src/managers/EventManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-10-22 16:15:48 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-10-22 16:15:52 +0100
commit0d7d7a970dc047517ed4d3922c1da3638cb51aed (patch)
tree08c51a602db2dd1cf1c51bf9132a1103937e962b /src/managers/EventManager.cpp
parent3a27ef5e12f0336b0a4bfce0ba98be45f0f5ef51 (diff)
fix crash in event manager on hangup
Diffstat (limited to 'src/managers/EventManager.cpp')
-rw-r--r--src/managers/EventManager.cpp25
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());
}
}