diff options
| -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) { |