summaryrefslogtreecommitdiff
path: root/src/managers/EventManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-10-03 20:47:15 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-10-03 20:47:15 +0100
commit49ab3890aa826918568c62f9cda4df023f3dcbb2 (patch)
tree0b9b8ba4160dab6080896bc4b8ee3ac4255935ba /src/managers/EventManager.cpp
parent85eea70be41f6ea7f5358aa17e8e004537407e3f (diff)
remove polling from socket2, fully event based
Diffstat (limited to 'src/managers/EventManager.cpp')
-rw-r--r--src/managers/EventManager.cpp73
1 files changed, 34 insertions, 39 deletions
diff --git a/src/managers/EventManager.cpp b/src/managers/EventManager.cpp
index 98dd5049..b5bcf78a 100644
--- a/src/managers/EventManager.cpp
+++ b/src/managers/EventManager.cpp
@@ -36,19 +36,12 @@ void CEventManager::startThread() {
// 10 max queued.
listen(SOCKET, 10);
- char readBuf[1024] = {0};
-
sockaddr_in clientAddress;
socklen_t clientSize = sizeof(clientAddress);
Debug::log(LOG, "Hypr socket 2 started at %s", socketPath.c_str());
- // set the socket nonblock
- int flags = fcntl(SOCKET, F_GETFL, 0);
- fcntl(SOCKET, F_SETFL, flags | O_NONBLOCK);
-
while (1) {
-
const auto ACCEPTEDCONNECTION = accept(SOCKET, (sockaddr*)&clientAddress, &clientSize);
if (ACCEPTEDCONNECTION > 0) {
@@ -61,49 +54,49 @@ void CEventManager::startThread() {
Debug::log(LOG, "Socket 2 accepted a new client at FD %d", ACCEPTEDCONNECTION);
}
- // pong if all FDs valid
- for (auto it = m_dAcceptedSocketFDs.begin(); it != m_dAcceptedSocketFDs.end();) {
- auto sizeRead = recv(*it, &readBuf, 1024, 0);
+ ensureFDsValid();
+ }
- if (sizeRead != 0) {
- it++;
- continue;
- }
+ close(SOCKET);
+ });
- // invalid!
- Debug::log(LOG, "Removed invalid socket (2) FD: %d", *it);
- it = m_dAcceptedSocketFDs.erase(it);
- }
+ m_tThread.detach();
+}
- // valid FDs, check the queue
- // don't do anything if main thread is writing to the eventqueue
- eventQueueMutex.lock();
+void CEventManager::ensureFDsValid() {
+ static char readBuf[1024] = {0};
- if (m_dQueuedEvents.empty()){ // if queue empty, sleep and ignore
- eventQueueMutex.unlock();
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
- continue;
- }
+ // pong if all FDs valid
+ for (auto it = m_dAcceptedSocketFDs.begin(); it != m_dAcceptedSocketFDs.end();) {
+ auto sizeRead = recv(*it, &readBuf, 1024, 0);
- // write all queued events
- 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());
- }
- }
+ if (sizeRead != 0) {
+ it++;
+ continue;
+ }
+
+ // invalid!
+ Debug::log(LOG, "Removed invalid socket (2) FD: %d", *it);
+ it = m_dAcceptedSocketFDs.erase(it);
+ }
+}
- m_dQueuedEvents.clear();
+void CEventManager::flushEvents() {
- eventQueueMutex.unlock();
+ ensureFDsValid();
+
+ eventQueueMutex.lock();
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
+ 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());
}
+ }
- close(SOCKET);
- });
+ m_dQueuedEvents.clear();
- m_tThread.detach();
+ eventQueueMutex.unlock();
}
void CEventManager::postEvent(const SHyprIPCEvent event, bool force) {
@@ -117,5 +110,7 @@ void CEventManager::postEvent(const SHyprIPCEvent event, bool force) {
eventQueueMutex.lock();
m_dQueuedEvents.push_back(ev);
eventQueueMutex.unlock();
+
+ flushEvents();
}, event).detach();
}