summaryrefslogtreecommitdiffstats
path: root/core/jni/android_view_DisplayEventReceiver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/jni/android_view_DisplayEventReceiver.cpp')
-rw-r--r--core/jni/android_view_DisplayEventReceiver.cpp42
1 files changed, 22 insertions, 20 deletions
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index d80bfb3..89058a7 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -42,12 +42,13 @@ static struct {
} gDisplayEventReceiverClassInfo;
-class NativeDisplayEventReceiver : public RefBase {
+class NativeDisplayEventReceiver : public LooperCallback {
public:
NativeDisplayEventReceiver(JNIEnv* env,
jobject receiverObj, const sp<MessageQueue>& messageQueue);
status_t initialize();
+ void dispose();
status_t scheduleVsync();
protected:
@@ -59,7 +60,7 @@ private:
DisplayEventReceiver mReceiver;
bool mWaitingForVsync;
- static int handleReceiveCallback(int receiveFd, int events, void* data);
+ virtual int handleEvent(int receiveFd, int events, void* data);
bool readLastVsyncMessage(nsecs_t* outTimestamp, uint32_t* outCount);
};
@@ -72,12 +73,6 @@ NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env,
}
NativeDisplayEventReceiver::~NativeDisplayEventReceiver() {
- ALOGV("receiver %p ~ Disposing display event receiver.", this);
-
- if (!mReceiver.initCheck()) {
- mMessageQueue->getLooper()->removeFd(mReceiver.getFd());
- }
-
JNIEnv* env = AndroidRuntime::getJNIEnv();
env->DeleteGlobalRef(mReceiverObjGlobal);
}
@@ -90,13 +85,21 @@ status_t NativeDisplayEventReceiver::initialize() {
}
int rc = mMessageQueue->getLooper()->addFd(mReceiver.getFd(), 0, ALOOPER_EVENT_INPUT,
- handleReceiveCallback, this);
+ this, NULL);
if (rc < 0) {
return UNKNOWN_ERROR;
}
return OK;
}
+void NativeDisplayEventReceiver::dispose() {
+ ALOGV("receiver %p ~ Disposing display event receiver.", this);
+
+ if (!mReceiver.initCheck()) {
+ mMessageQueue->getLooper()->removeFd(mReceiver.getFd());
+ }
+}
+
status_t NativeDisplayEventReceiver::scheduleVsync() {
if (!mWaitingForVsync) {
ALOGV("receiver %p ~ Scheduling vsync.", this);
@@ -117,9 +120,7 @@ status_t NativeDisplayEventReceiver::scheduleVsync() {
return OK;
}
-int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events, void* data) {
- sp<NativeDisplayEventReceiver> r = static_cast<NativeDisplayEventReceiver*>(data);
-
+int NativeDisplayEventReceiver::handleEvent(int receiveFd, int events, void* data) {
if (events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP)) {
ALOGE("Display event receiver pipe was closed or an error occurred. "
"events=0x%x", events);
@@ -135,23 +136,23 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events,
// Drain all pending events, keep the last vsync.
nsecs_t vsyncTimestamp;
uint32_t vsyncCount;
- if (!r->readLastVsyncMessage(&vsyncTimestamp, &vsyncCount)) {
- ALOGV("receiver %p ~ Woke up but there was no vsync pulse!", data);
+ if (!readLastVsyncMessage(&vsyncTimestamp, &vsyncCount)) {
+ ALOGV("receiver %p ~ Woke up but there was no vsync pulse!", this);
return 1; // keep the callback, did not obtain a vsync pulse
}
ALOGV("receiver %p ~ Vsync pulse: timestamp=%lld, count=%d",
- data, vsyncTimestamp, vsyncCount);
- r->mWaitingForVsync = false;
+ this, vsyncTimestamp, vsyncCount);
+ mWaitingForVsync = false;
JNIEnv* env = AndroidRuntime::getJNIEnv();
- ALOGV("receiver %p ~ Invoking vsync handler.", data);
- env->CallVoidMethod(r->mReceiverObjGlobal,
+ ALOGV("receiver %p ~ Invoking vsync handler.", this);
+ env->CallVoidMethod(mReceiverObjGlobal,
gDisplayEventReceiverClassInfo.dispatchVsync, vsyncTimestamp, vsyncCount);
- ALOGV("receiver %p ~ Returned from vsync handler.", data);
+ ALOGV("receiver %p ~ Returned from vsync handler.", this);
- r->mMessageQueue->raiseAndClearException(env, "dispatchVsync");
+ mMessageQueue->raiseAndClearException(env, "dispatchVsync");
return 1; // keep the callback
}
@@ -201,6 +202,7 @@ static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj,
static void nativeDispose(JNIEnv* env, jclass clazz, jint receiverPtr) {
sp<NativeDisplayEventReceiver> receiver =
reinterpret_cast<NativeDisplayEventReceiver*>(receiverPtr);
+ receiver->dispose();
receiver->decStrong(gDisplayEventReceiverClassInfo.clazz); // drop reference held by the object
}