summaryrefslogtreecommitdiffstats
path: root/base/android
diff options
context:
space:
mode:
authornileshagrawal@chromium.org <nileshagrawal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-02 02:59:57 +0000
committernileshagrawal@chromium.org <nileshagrawal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-02 02:59:57 +0000
commita70cb2325da20d6abf66cce2c12d9dc8802041a3 (patch)
tree0c5dc4b5c6fd85b456cda764747d8c2e9987c080 /base/android
parentfce61dcbdd3fb31839ba056b204bf903580a163b (diff)
downloadchromium_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.cc21
-rw-r--r--base/android/jni_helper.h7
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_