diff options
| author | 2022-09-22 02:45:40 +0000 | |
|---|---|---|
| committer | 2022-09-22 02:45:40 +0000 | |
| commit | 8d8831bbfaedd316ca36f45dcdef7fa24faf7773 (patch) | |
| tree | e5e750faa15ab86dda8966c06f9a61e019196c9c | |
| parent | b883281ecc7f23992abee297760b91006c30f04f (diff) | |
| parent | ad5979611a568f71f00f9402774bca071251750e (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.cpp | 36 |
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) { |