blob: a107f3027a06182067141e934aa531b8052b9ced [file] [log] [blame]
#define LOG_TAG "VNC-EventQueue"
#include <utils/Log.h>
#include "EventQueue.h"
using namespace android;
void EventQueue::enqueue(const Event& event) {
mQueue.push(event);
ALOGV("enqueue: mId=%d mData=%p qlen=%zu", event.mId, event.mData, mQueue.size());
Mutex::Autolock _l(mMutex);
mCondition.broadcast();
}
void EventQueue::await() {
Mutex::Autolock _l(mMutex);
while (mRunning) {
ALOGV("begin wait");
mCondition.wait(mMutex);
ALOGV("queue active");
while (!mQueue.empty()) {
Event event = mQueue.front();
mQueue.pop();
mMutex.unlock();
for (std::vector<EventListener *>::iterator it = mListeners.begin();
it != mListeners.end(); ++it) {
ALOGV("call listener: %p", *it);
(*it)->onEvent(event);
}
mMutex.lock();
}
}
}
void EventQueue::shutdown() {
Mutex::Autolock _l(mMutex);
flush();
mRunning = false;
mCondition.broadcast();
}
void EventQueue::flush() {
Mutex::Autolock _l(mMutex);
mQueue = {};
}
void EventQueue::addListener(EventListener *listener) {
mListeners.push_back(listener);
ALOGV("addListener: %p", listener);
}
void EventQueue::removeListener(EventListener *listener) {
mListeners.erase(std::remove(mListeners.begin(), mListeners.end(), listener), mListeners.end());
}