vnc: Remove EventQueue
Put the VNCFlinger in the screenData so that it can be accessed
by clients. This removes the need for the message queue. The
buffer ready event was removed in a previous commit.
diff --git a/src/VNCFlinger.cpp b/src/VNCFlinger.cpp
index dfb1a38..70f741a 100644
--- a/src/VNCFlinger.cpp
+++ b/src/VNCFlinger.cpp
@@ -14,8 +14,6 @@
using namespace android;
-EventQueue *VNCFlinger::sQueue = new EventQueue();
-
status_t VNCFlinger::start() {
Mutex::Autolock _l(mMutex);
@@ -28,7 +26,8 @@
ALOGD("VNCFlinger is running!");
rfbRunEventLoop(mVNCScreen, -1, true);
- sQueue->await();
+
+ mCondition.wait(mMutex);
release_l();
return NO_ERROR;
@@ -56,8 +55,6 @@
ALOGD("Display dimensions: %dx%d rotated=%d", mWidth, mHeight, rotated);
- sQueue->addListener(this);
-
rfbLog = VNCFlinger::rfbLogger;
rfbErr = VNCFlinger::rfbLogger;
@@ -81,6 +78,7 @@
mVNCScreen->serverFormat.bitsPerPixel = 32;
mVNCScreen->handleEventsEagerly = true;
mVNCScreen->deferUpdateTime = 16;
+ mVNCScreen->screenData = this;
rfbInitServer(mVNCScreen);
@@ -94,7 +92,6 @@
}
void VNCFlinger::release_l() {
- sQueue->removeListener(this);
mVirtualDisplay.clear();
ALOGD("VNCFlinger released");
@@ -102,70 +99,51 @@
status_t VNCFlinger::stop() {
Mutex::Autolock _l(mMutex);
- sQueue->shutdown();
+ mCondition.signal();
return NO_ERROR;
}
-void VNCFlinger::onEvent(const Event& event) {
-
- ALOGV("onEvent: mId=%d mData=%p", event.mId, event.mData);
-
- switch(event.mId) {
- case EVENT_CLIENT_CONNECT:
- if (mClientCount == 0) {
- InputDevice::start(mWidth, mHeight);
- mVirtualDisplay->start(mMainDpyInfo, sQueue);
- }
- mClientCount++;
-
- ALOGI("Client connected (%zu)", mClientCount);
- break;
-
- case EVENT_CLIENT_GONE:
- if (mClientCount > 0) {
- mClientCount--;
- if (mClientCount == 0) {
- mVirtualDisplay->stop();
- InputDevice::stop();
- }
- }
-
- ALOGI("Client disconnected (%zu)", mClientCount);
- break;
-
- /*
- case EVENT_BUFFER_READY:
- int64_t startWhenNsec, endWhenNsec;
- startWhenNsec = systemTime(CLOCK_MONOTONIC);
- if (event.mData == NULL) {
- break;
- }
- //memcpy(mVNCBuf, (uint8_t *) event.mData, mWidth * mHeight * 4);
- //mVNCScreen->frameBuffer = (char *) event.mData;
- rfbMarkRectAsModified(mVNCScreen, 0, 0, mWidth, mHeight);
- endWhenNsec = systemTime(CLOCK_MONOTONIC);
- ALOGV("got pixels (mark=%.3fms)",
- (endWhenNsec - startWhenNsec) / 1000000.0);
- break;
- */
-
- default:
- ALOGE("Unhandled event: %d", event.mId);
- break;
+size_t VNCFlinger::addClient() {
+ Mutex::Autolock _l(mMutex);
+ if (mClientCount == 0) {
+ InputDevice::start(mWidth, mHeight);
+ mVirtualDisplay->start(mMainDpyInfo);
}
+ mClientCount++;
+
+ ALOGI("Client connected (%zu)", mClientCount);
+
+ return mClientCount;
}
-ClientGoneHookPtr VNCFlinger::onClientGone(rfbClientPtr /* cl */) {
+size_t VNCFlinger::removeClient() {
+ Mutex::Autolock _l(mMutex);
+ if (mClientCount > 0) {
+ mClientCount--;
+ if (mClientCount == 0) {
+ mVirtualDisplay->stop();
+ InputDevice::stop();
+ }
+ }
+
+ ALOGI("Client disconnected (%zu)", mClientCount);
+
+ return mClientCount;
+}
+
+ClientGoneHookPtr VNCFlinger::onClientGone(rfbClientPtr cl) {
ALOGV("onClientGone");
- sQueue->enqueue(Event(EVENT_CLIENT_GONE));
+ VNCFlinger *vf = (VNCFlinger *)cl->screen->screenData;
+ vf->removeClient();
return 0;
}
enum rfbNewClientAction VNCFlinger::onNewClient(rfbClientPtr cl) {
ALOGV("onNewClient");
cl->clientGoneHook = (ClientGoneHookPtr) VNCFlinger::onClientGone;
- sQueue->enqueue(Event(EVENT_CLIENT_CONNECT));
+ VNCFlinger *vf = (VNCFlinger *)cl->screen->screenData;
+ vf->addClient();
return RFB_CLIENT_ACCEPT;
}