summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2022-09-22 02:45:40 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2022-09-22 02:45:40 +0000
commit8d8831bbfaedd316ca36f45dcdef7fa24faf7773 (patch)
treee5e750faa15ab86dda8966c06f9a61e019196c9c
parentb883281ecc7f23992abee297760b91006c30f04f (diff)
parentad5979611a568f71f00f9402774bca071251750e (diff)
Merge "NativeMessageQueue: ensure nativeDestroy success" am: 1a4ac8e6aa am: ad5979611a
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2202591 Change-Id: I7d704f54384fa14c51856a9a361f74bf539b8362 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--core/jni/android_os_MessageQueue.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp
index f7a98d16f2e3..30d9ea19be39 100644
--- a/core/jni/android_os_MessageQueue.cpp
+++ b/core/jni/android_os_MessageQueue.cpp
@@ -51,6 +51,21 @@ public:
virtual int handleEvent(int fd, int events, void* data);
+ /**
+ * A simple proxy that holds a weak reference to a looper callback.
+ */
+ class WeakLooperCallback : public LooperCallback {
+ protected:
+ virtual ~WeakLooperCallback();
+
+ public:
+ WeakLooperCallback(const wp<LooperCallback>& callback);
+ virtual int handleEvent(int fd, int events, void* data);
+
+ private:
+ wp<LooperCallback> mCallback;
+ };
+
private:
JNIEnv* mPollEnv;
jobject mPollObj;
@@ -131,7 +146,8 @@ void NativeMessageQueue::setFileDescriptorEvents(int fd, int events) {
if (events & CALLBACK_EVENT_OUTPUT) {
looperEvents |= Looper::EVENT_OUTPUT;
}
- mLooper->addFd(fd, Looper::POLL_CALLBACK, looperEvents, this,
+ mLooper->addFd(fd, Looper::POLL_CALLBACK, looperEvents,
+ sp<WeakLooperCallback>::make(this),
reinterpret_cast<void*>(events));
} else {
mLooper->removeFd(fd);
@@ -162,6 +178,24 @@ int NativeMessageQueue::handleEvent(int fd, int looperEvents, void* data) {
}
+// --- NativeMessageQueue::WeakLooperCallback ---
+
+NativeMessageQueue::WeakLooperCallback::WeakLooperCallback(const wp<LooperCallback>& callback) :
+ mCallback(callback) {
+}
+
+NativeMessageQueue::WeakLooperCallback::~WeakLooperCallback() {
+}
+
+int NativeMessageQueue::WeakLooperCallback::handleEvent(int fd, int events, void* data) {
+ sp<LooperCallback> callback = mCallback.promote();
+ if (callback != nullptr) {
+ return callback->handleEvent(fd, events, data);
+ }
+ return 0;
+}
+
+
// ----------------------------------------------------------------------------
sp<MessageQueue> android_os_MessageQueue_getMessageQueue(JNIEnv* env, jobject messageQueueObj) {