Merge "Close race condition in binderDied()" into mnc-dev

This commit is contained in:
Christopher Tate
2015-05-21 20:27:11 +00:00
committed by Android (Google) Code Review

View File

@@ -358,6 +358,8 @@ public:
void add(const sp<JavaDeathRecipient>& recipient);
void remove(const sp<JavaDeathRecipient>& recipient);
sp<JavaDeathRecipient> find(jobject recipient);
Mutex& lock(); // Use with care; specifically for mutual exclusion during binder death
};
// ----------------------------------------------------------------------------
@@ -392,11 +394,18 @@ public:
"*** Uncaught exception returned from death notification!");
}
// Demote from strong ref to weak after binderDied() has been delivered,
// to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed.
mObjectWeak = env->NewWeakGlobalRef(mObject);
env->DeleteGlobalRef(mObject);
mObject = NULL;
// Serialize with our containing DeathRecipientList so that we can't
// delete the global ref on mObject while the list is being iterated.
sp<DeathRecipientList> list = mList.promote();
if (list != NULL) {
AutoMutex _l(list->lock());
// Demote from strong ref to weak after binderDied() has been delivered,
// to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed.
mObjectWeak = env->NewWeakGlobalRef(mObject);
env->DeleteGlobalRef(mObject);
mObject = NULL;
}
}
}
@@ -518,6 +527,10 @@ sp<JavaDeathRecipient> DeathRecipientList::find(jobject recipient) {
return NULL;
}
Mutex& DeathRecipientList::lock() {
return mLock;
}
// ----------------------------------------------------------------------------
namespace android {