Merge "NativeMessageQueue: ensure nativeDestroy success" am: 1a4ac8e6aa am: ad5979611a am: 8d8831bbfa

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2202591

Change-Id: Ica38f9f88f1b5f2412df0cfac5873bd2a0376eba
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Steven Moreland
2022-09-22 03:40:05 +00:00
committed by Automerger Merge Worker

View File

@@ -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) {