lib/base: Use standard mutex primitives in EventQueue

This commit is contained in:
Povilas Kanapickas 2021-11-03 02:58:27 +02:00
parent c16581b399
commit cb69469871
2 changed files with 12 additions and 20 deletions

View File

@ -18,8 +18,6 @@
#include "base/EventQueue.h" #include "base/EventQueue.h"
#include "mt/Mutex.h"
#include "mt/Lock.h"
#include "arch/Arch.h" #include "arch/Arch.h"
#include "base/SimpleEventQueueBuffer.h" #include "base/SimpleEventQueueBuffer.h"
#include "base/Stopwatch.h" #include "base/Stopwatch.h"
@ -86,9 +84,7 @@ EventQueue::EventQueue() :
m_typesForIPrimaryScreen(NULL), m_typesForIPrimaryScreen(NULL),
m_typesForIScreen(NULL), m_typesForIScreen(NULL),
m_typesForClipboard(NULL), m_typesForClipboard(NULL),
m_typesForFile(NULL), m_typesForFile(NULL)
m_readyMutex(new Mutex),
m_readyCondVar(new CondVar<bool>(m_readyMutex, false))
{ {
ARCH->setSignalHandler(Arch::kINTERRUPT, &interrupt, this); ARCH->setSignalHandler(Arch::kINTERRUPT, &interrupt, this);
ARCH->setSignalHandler(Arch::kTERMINATE, &interrupt, this); ARCH->setSignalHandler(Arch::kTERMINATE, &interrupt, this);
@ -98,9 +94,6 @@ EventQueue::EventQueue() :
EventQueue::~EventQueue() EventQueue::~EventQueue()
{ {
delete m_buffer; delete m_buffer;
delete m_readyCondVar;
delete m_readyMutex;
ARCH->setSignalHandler(Arch::kINTERRUPT, NULL, NULL); ARCH->setSignalHandler(Arch::kINTERRUPT, NULL, NULL);
ARCH->setSignalHandler(Arch::kTERMINATE, NULL, NULL); ARCH->setSignalHandler(Arch::kTERMINATE, NULL, NULL);
} }
@ -110,9 +103,9 @@ EventQueue::loop()
{ {
m_buffer->init(); m_buffer->init();
{ {
Lock lock(m_readyMutex); std::unique_lock<std::mutex> lock(ready_mutex_);
*m_readyCondVar = true; is_ready_ = true;
m_readyCondVar->signal(); ready_cv_.notify_one();
} }
LOG((CLOG_DEBUG "event queue is ready")); LOG((CLOG_DEBUG "event queue is ready"));
while (!m_pending.empty()) { while (!m_pending.empty()) {
@ -303,7 +296,7 @@ EventQueue::addEvent(const Event& event)
dispatchEvent(event); dispatchEvent(event);
Event::deleteData(event); Event::deleteData(event);
} }
else if (!(*m_readyCondVar)) { else if (!is_ready_) {
m_pending.push(event); m_pending.push(event);
} }
else { else {
@ -566,13 +559,10 @@ EventQueue::getSystemTarget()
void void
EventQueue::waitForReady() const EventQueue::waitForReady() const
{ {
double timeout = ARCH->time() + 10; std::unique_lock<std::mutex> lock(ready_mutex_);
Lock lock(m_readyMutex);
while (!m_readyCondVar->wait()) { if (!ready_cv_.wait_for(lock, std::chrono::seconds{10}, [this](){ return is_ready_; })) {
if (ARCH->time() > timeout) { throw std::runtime_error("event queue is not ready within 5 sec");
throw std::runtime_error("event queue is not ready within 5 sec");
}
} }
} }

View File

@ -28,6 +28,7 @@
#include "common/stdset.h" #include "common/stdset.h"
#include "base/NonBlockingStream.h" #include "base/NonBlockingStream.h"
#include <condition_variable>
#include <mutex> #include <mutex>
#include <queue> #include <queue>
@ -180,8 +181,9 @@ private:
IScreenEvents* m_typesForIScreen; IScreenEvents* m_typesForIScreen;
ClipboardEvents* m_typesForClipboard; ClipboardEvents* m_typesForClipboard;
FileEvents* m_typesForFile; FileEvents* m_typesForFile;
Mutex* m_readyMutex; mutable std::mutex ready_mutex_;
CondVar<bool>* m_readyCondVar; mutable std::condition_variable ready_cv_;
bool is_ready_ = false;
std::queue<Event> m_pending; std::queue<Event> m_pending;
NonBlockingStream m_parentStream; NonBlockingStream m_parentStream;
}; };