Merge "Warn only if we're tearing down "live" DeathRecipient content"
This commit is contained in:
committed by
Android (Google) Code Review
commit
60ce25b34d
@@ -39,6 +39,8 @@
|
|||||||
#include <binder/IServiceManager.h>
|
#include <binder/IServiceManager.h>
|
||||||
#include <utils/threads.h>
|
#include <utils/threads.h>
|
||||||
|
|
||||||
|
#include <ScopedUtfChars.h>
|
||||||
|
|
||||||
#include <android_runtime/AndroidRuntime.h>
|
#include <android_runtime/AndroidRuntime.h>
|
||||||
|
|
||||||
//#undef LOGV
|
//#undef LOGV
|
||||||
@@ -444,6 +446,25 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void warnIfStillLive() {
|
||||||
|
JNIEnv* env = javavm_to_jnienv(mVM);
|
||||||
|
if (mObject != NULL) {
|
||||||
|
// Okay, something is wrong -- we have a hard reference to a live death
|
||||||
|
// recipient on the VM side, but the list is being torn down.
|
||||||
|
jclass clazz = env->GetObjectClass(mObject);
|
||||||
|
jmethodID getnameMethod = env->GetMethodID(clazz, "getName", NULL);
|
||||||
|
jstring nameString = (jstring) env->CallObjectMethod(clazz, getnameMethod);
|
||||||
|
if (nameString) {
|
||||||
|
ScopedUtfChars nameUtf(env, nameString);
|
||||||
|
LOGW("BinderProxy is being destroyed but the application did not call "
|
||||||
|
"unlinkToDeath to unlink all of its death recipients beforehand. "
|
||||||
|
"Releasing leaked death recipient: %s", nameUtf.c_str());
|
||||||
|
env->DeleteLocalRef(nameString);
|
||||||
|
}
|
||||||
|
env->DeleteLocalRef(clazz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~JavaDeathRecipient()
|
virtual ~JavaDeathRecipient()
|
||||||
{
|
{
|
||||||
@@ -478,7 +499,10 @@ DeathRecipientList::~DeathRecipientList() {
|
|||||||
// to the list are holding references on the list object. Only when they are torn
|
// to the list are holding references on the list object. Only when they are torn
|
||||||
// down can the list header be destroyed.
|
// down can the list header be destroyed.
|
||||||
if (mList.size() > 0) {
|
if (mList.size() > 0) {
|
||||||
LOGE("Retiring DRL %p with extant death recipients\n", this);
|
List< sp<JavaDeathRecipient> >::iterator iter;
|
||||||
|
for (iter = mList.begin(); iter != mList.end(); iter++) {
|
||||||
|
(*iter)->warnIfStillLive();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user