Merge "Warn only if we're tearing down "live" DeathRecipient content"

This commit is contained in:
Christopher Tate
2011-08-23 16:43:30 -07:00
committed by Android (Google) Code Review

View File

@@ -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();
}
} }
} }