diff options
| author | Chris Craik <ccraik@google.com> | 2013-09-11 17:40:39 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-11 17:40:39 +0000 |
| commit | 68fbe16ba0072326c1c6b09817f46ccdc5ee15b9 (patch) | |
| tree | 4dbe2033f12b4d91964b8f14c7fb93d07f31a51d /core/jni | |
| parent | 139ae5477f2df8aef40f0689371b055a438a72af (diff) | |
| parent | 28a1222bafbc5b3124cc8a5c400024c037047699 (diff) | |
| download | frameworks_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.cpp | 12 |
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!"); |
