@@ -42,12 +42,13 @@ static struct {
4242} gDisplayEventReceiverClassInfo ;
4343
4444
45- class NativeDisplayEventReceiver : public RefBase {
45+ class NativeDisplayEventReceiver : public LooperCallback {
4646public:
4747 NativeDisplayEventReceiver (JNIEnv* env,
4848 jobject receiverObj, const sp<MessageQueue>& messageQueue);
4949
5050 status_t initialize ();
51+ void dispose ();
5152 status_t scheduleVsync ();
5253
5354protected:
@@ -59,7 +60,7 @@ class NativeDisplayEventReceiver : public RefBase {
5960 DisplayEventReceiver mReceiver ;
6061 bool mWaitingForVsync ;
6162
62- static int handleReceiveCallback (int receiveFd, int events, void * data);
63+ virtual int handleEvent (int receiveFd, int events, void * data);
6364 bool readLastVsyncMessage (nsecs_t * outTimestamp, uint32_t * outCount);
6465};
6566
@@ -72,12 +73,6 @@ NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env,
7273}
7374
7475NativeDisplayEventReceiver::~NativeDisplayEventReceiver () {
75- ALOGV (" receiver %p ~ Disposing display event receiver." , this );
76-
77- if (!mReceiver .initCheck ()) {
78- mMessageQueue ->getLooper ()->removeFd (mReceiver .getFd ());
79- }
80-
8176 JNIEnv* env = AndroidRuntime::getJNIEnv ();
8277 env->DeleteGlobalRef (mReceiverObjGlobal );
8378}
@@ -90,13 +85,21 @@ status_t NativeDisplayEventReceiver::initialize() {
9085 }
9186
9287 int rc = mMessageQueue ->getLooper ()->addFd (mReceiver .getFd (), 0 , ALOOPER_EVENT_INPUT,
93- handleReceiveCallback, this );
88+ this , NULL );
9489 if (rc < 0 ) {
9590 return UNKNOWN_ERROR;
9691 }
9792 return OK;
9893}
9994
95+ void NativeDisplayEventReceiver::dispose () {
96+ ALOGV (" receiver %p ~ Disposing display event receiver." , this );
97+
98+ if (!mReceiver .initCheck ()) {
99+ mMessageQueue ->getLooper ()->removeFd (mReceiver .getFd ());
100+ }
101+ }
102+
100103status_t NativeDisplayEventReceiver::scheduleVsync () {
101104 if (!mWaitingForVsync ) {
102105 ALOGV (" receiver %p ~ Scheduling vsync." , this );
@@ -117,9 +120,7 @@ status_t NativeDisplayEventReceiver::scheduleVsync() {
117120 return OK;
118121}
119122
120- int NativeDisplayEventReceiver::handleReceiveCallback (int receiveFd, int events, void * data) {
121- sp<NativeDisplayEventReceiver> r = static_cast <NativeDisplayEventReceiver*>(data);
122-
123+ int NativeDisplayEventReceiver::handleEvent (int receiveFd, int events, void * data) {
123124 if (events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP)) {
124125 ALOGE (" Display event receiver pipe was closed or an error occurred. "
125126 " events=0x%x" , events);
@@ -135,23 +136,23 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events,
135136 // Drain all pending events, keep the last vsync.
136137 nsecs_t vsyncTimestamp;
137138 uint32_t vsyncCount;
138- if (!r-> readLastVsyncMessage (&vsyncTimestamp, &vsyncCount)) {
139- ALOGV (" receiver %p ~ Woke up but there was no vsync pulse!" , data );
139+ if (!readLastVsyncMessage (&vsyncTimestamp, &vsyncCount)) {
140+ ALOGV (" receiver %p ~ Woke up but there was no vsync pulse!" , this );
140141 return 1 ; // keep the callback, did not obtain a vsync pulse
141142 }
142143
143144 ALOGV (" receiver %p ~ Vsync pulse: timestamp=%lld, count=%d" ,
144- data , vsyncTimestamp, vsyncCount);
145- r-> mWaitingForVsync = false ;
145+ this , vsyncTimestamp, vsyncCount);
146+ mWaitingForVsync = false ;
146147
147148 JNIEnv* env = AndroidRuntime::getJNIEnv ();
148149
149- ALOGV (" receiver %p ~ Invoking vsync handler." , data );
150- env->CallVoidMethod (r-> mReceiverObjGlobal ,
150+ ALOGV (" receiver %p ~ Invoking vsync handler." , this );
151+ env->CallVoidMethod (mReceiverObjGlobal ,
151152 gDisplayEventReceiverClassInfo .dispatchVsync , vsyncTimestamp, vsyncCount);
152- ALOGV (" receiver %p ~ Returned from vsync handler." , data );
153+ ALOGV (" receiver %p ~ Returned from vsync handler." , this );
153154
154- r-> mMessageQueue ->raiseAndClearException (env, " dispatchVsync" );
155+ mMessageQueue ->raiseAndClearException (env, " dispatchVsync" );
155156 return 1 ; // keep the callback
156157}
157158
@@ -201,6 +202,7 @@ static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj,
201202static void nativeDispose (JNIEnv* env, jclass clazz, jint receiverPtr) {
202203 sp<NativeDisplayEventReceiver> receiver =
203204 reinterpret_cast <NativeDisplayEventReceiver*>(receiverPtr);
205+ receiver->dispose ();
204206 receiver->decStrong (gDisplayEventReceiverClassInfo .clazz ); // drop reference held by the object
205207}
206208
0 commit comments