lib/base: Use standard mutex primitives in EventQueue
This commit is contained in:
parent
c16581b399
commit
cb69469871
|
@ -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,15 +559,12 @@ 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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// EventQueue::Timer
|
// EventQueue::Timer
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue