summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2013-09-11 17:40:39 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-11 17:40:39 +0000
commit68fbe16ba0072326c1c6b09817f46ccdc5ee15b9 (patch)
tree4dbe2033f12b4d91964b8f14c7fb93d07f31a51d /core/jni
parent139ae5477f2df8aef40f0689371b055a438a72af (diff)
parent28a1222bafbc5b3124cc8a5c400024c037047699 (diff)
downloadframeworks_base-68fbe16ba0072326c1c6b09817f46ccdc5ee15b9.zip
frameworks_base-68fbe16ba0072326c1c6b09817f46ccdc5ee15b9.tar.gz
frameworks_base-68fbe16ba0072326c1c6b09817f46ccdc5ee15b9.tar.bz2
Merge "Avoid ref-ing AndroidPixelRefs that wrap others in globalRef/Unref" into klp-dev
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/android/graphics/Graphics.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 1ff0d63..8cb152d 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -479,7 +479,13 @@ void AndroidPixelRef::globalRef(void* localref) {
if (fWrappedPixelRef) {
// delegate java obj management to the wrapped ref
fWrappedPixelRef->globalRef(localref);
- } else if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) {
+
+ // Note: we only ref and unref the wrapped AndroidPixelRef so that
+ // bitmap->pixelRef()->globalRef() and globalUnref() can be used in a pair, even if
+ // the bitmap has its underlying AndroidPixelRef swapped out/wrapped
+ return;
+ }
+ if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) {
JNIEnv *env = vm2env(fVM);
// If JNI ref was passed, it is always used
@@ -506,7 +512,9 @@ void AndroidPixelRef::globalUnref() {
if (fWrappedPixelRef) {
// delegate java obj management to the wrapped ref
fWrappedPixelRef->globalUnref();
- } else if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) {
+ return;
+ }
+ if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) {
JNIEnv *env = vm2env(fVM);
if (!fHasGlobalRef) {
SkDebugf("We don't have a global ref!");