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>
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user