diff options
author | nileshagrawal@chromium.org <nileshagrawal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-02 02:59:57 +0000 |
---|---|---|
committer | nileshagrawal@chromium.org <nileshagrawal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-02 02:59:57 +0000 |
commit | a70cb2325da20d6abf66cce2c12d9dc8802041a3 (patch) | |
tree | 0c5dc4b5c6fd85b456cda764747d8c2e9987c080 /base/android | |
parent | fce61dcbdd3fb31839ba056b204bf903580a163b (diff) | |
download | chromium_src-a70cb2325da20d6abf66cce2c12d9dc8802041a3.zip chromium_src-a70cb2325da20d6abf66cce2c12d9dc8802041a3.tar.gz chromium_src-a70cb2325da20d6abf66cce2c12d9dc8802041a3.tar.bz2 |
Use JavaObjectWeakGlobalRef in ContentViewCore.
Java ContentViewCore object may be garbage
collected without first destroying the native object. Because of this,
all C++->Java calls to ContentViewCore must be guarded with a null
check.
BUG=139386,138237
Review URL: https://chromiumcodereview.appspot.com/10827125
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149570 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android')
-rw-r--r-- | base/android/jni_helper.cc | 21 | ||||
-rw-r--r-- | base/android/jni_helper.h | 7 |
2 files changed, 21 insertions, 7 deletions
diff --git a/base/android/jni_helper.cc b/base/android/jni_helper.cc index 5e9f409..3ff3bfb 100644 --- a/base/android/jni_helper.cc +++ b/base/android/jni_helper.cc @@ -15,8 +15,14 @@ JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj) } JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() { - DCHECK(obj_); - AttachCurrentThread()->DeleteWeakGlobalRef(obj_); + reset(); +} + +void JavaObjectWeakGlobalRef::reset() { + if (obj_) { + AttachCurrentThread()->DeleteWeakGlobalRef(obj_); + obj_ = NULL; + } } base::android::ScopedJavaLocalRef<jobject> @@ -25,9 +31,12 @@ base::android::ScopedJavaLocalRef<jobject> } base::android::ScopedJavaLocalRef<jobject> GetRealObject( - JNIEnv* env, jobject obj) { - jobject real = env->NewLocalRef(obj); - if (!real) - DLOG(ERROR) << "The real object has been deleted!"; + JNIEnv* env, jweak obj) { + jobject real = NULL; + if (obj) { + real = env->NewLocalRef(obj); + if (!real) + DLOG(ERROR) << "The real object has been deleted!"; + } return base::android::ScopedJavaLocalRef<jobject>(env, real); } diff --git a/base/android/jni_helper.h b/base/android/jni_helper.h index 61359ef..bd3579f 100644 --- a/base/android/jni_helper.h +++ b/base/android/jni_helper.h @@ -10,6 +10,9 @@ #include "base/android/scoped_java_ref.h" // Manages WeakGlobalRef lifecycle. +// This class is not thread-safe w.r.t. get() and reset(). Multiple threads may +// safely use get() concurrently, but if the user calls reset() (or of course, +// calls the destructor) they'll need to provide their own synchronization. class JavaObjectWeakGlobalRef { public: JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj); @@ -17,6 +20,8 @@ class JavaObjectWeakGlobalRef { base::android::ScopedJavaLocalRef<jobject> get(JNIEnv* env) const; + void reset(); + private: jweak obj_; @@ -26,6 +31,6 @@ class JavaObjectWeakGlobalRef { // Get the real object stored in the weak reference returned as a // ScopedJavaLocalRef. base::android::ScopedJavaLocalRef<jobject> GetRealObject( - JNIEnv* env, jobject obj); + JNIEnv* env, jweak obj); #endif // BASE_ANDROID_JNI_HELPER_H_ |