am 6534dd02: am 74261d84: Merge "Don\'t null the reference to Bitmap pixels until we\'re really ready" into jb-mr1-dev

* commit '6534dd0275c8d01de7e7400ba239d203c37c8164':
  Don't null the reference to Bitmap pixels until we're really ready
This commit is contained in:
Chet Haase
2012-10-22 15:52:20 -07:00
committed by Android Git Automerger
4 changed files with 31 additions and 15 deletions

View File

@@ -261,14 +261,14 @@ static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) {
delete bitmap;
}
static void Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) {
static jboolean Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) {
#ifdef USE_OPENGL_RENDERER
if (android::uirenderer::Caches::hasInstance()) {
android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap);
return;
return android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap);
}
#endif // USE_OPENGL_RENDERER
bitmap->setPixels(NULL, NULL);
return true;
}
// These must match the int values in Bitmap.java
@@ -665,7 +665,7 @@ static JNINativeMethod gBitmapMethods[] = {
{ "nativeCopy", "(IIZ)Landroid/graphics/Bitmap;",
(void*)Bitmap_copy },
{ "nativeDestructor", "(I)V", (void*)Bitmap_destructor },
{ "nativeRecycle", "(I)V", (void*)Bitmap_recycle },
{ "nativeRecycle", "(I)Z", (void*)Bitmap_recycle },
{ "nativeCompress", "(IIILjava/io/OutputStream;[B)Z",
(void*)Bitmap_compress },
{ "nativeErase", "(II)V", (void*)Bitmap_erase },

View File

@@ -201,9 +201,14 @@ public final class Bitmap implements Parcelable {
*/
public void recycle() {
if (!mRecycled) {
mBuffer = null;
nativeRecycle(mNativeBitmap);
mNinePatchChunk = null;
if (nativeRecycle(mNativeBitmap)) {
// return value indicates whether native pixel object was actually recycled.
// false indicates that it is still in use at the native level and these
// objects should not be collected now. They will be collected later when the
// Bitmap itself is collected.
mBuffer = null;
mNinePatchChunk = null;
}
mRecycled = true;
}
}
@@ -1391,7 +1396,7 @@ public final class Bitmap implements Parcelable {
private static native Bitmap nativeCopy(int srcBitmap, int nativeConfig,
boolean isMutable);
private static native void nativeDestructor(int nativeBitmap);
private static native void nativeRecycle(int nativeBitmap);
private static native boolean nativeRecycle(int nativeBitmap);
private static native boolean nativeCompress(int nativeBitmap, int format,
int quality, OutputStream stream,

View File

@@ -265,27 +265,38 @@ void ResourceCache::destructorLocked(SkiaColorFilter* resource) {
}
}
void ResourceCache::recycle(SkBitmap* resource) {
/**
* Return value indicates whether resource was actually recycled, which happens when RefCnt
* reaches 0.
*/
bool ResourceCache::recycle(SkBitmap* resource) {
Mutex::Autolock _l(mLock);
recycleLocked(resource);
return recycleLocked(resource);
}
void ResourceCache::recycleLocked(SkBitmap* resource) {
/**
* Return value indicates whether resource was actually recycled, which happens when RefCnt
* reaches 0.
*/
bool ResourceCache::recycleLocked(SkBitmap* resource) {
ssize_t index = mCache->indexOfKey(resource);
if (index < 0) {
// not tracking this resource; just recycle the pixel data
resource->setPixels(NULL, NULL);
return;
return true;
}
ResourceReference* ref = mCache->valueAt(index);
if (ref == NULL) {
// Should not get here - shouldn't get a call to recycle if we're not yet tracking it
return;
return true;
}
ref->recycled = true;
if (ref->refCount == 0) {
deleteResourceReferenceLocked(resource, ref);
return true;
}
// Still referring to resource, don't recycle yet
return false;
}
/**

View File

@@ -99,8 +99,8 @@ public:
void destructorLocked(SkiaShader* resource);
void destructorLocked(SkiaColorFilter* resource);
void recycle(SkBitmap* resource);
void recycleLocked(SkBitmap* resource);
bool recycle(SkBitmap* resource);
bool recycleLocked(SkBitmap* resource);
private:
void deleteResourceReferenceLocked(void* resource, ResourceReference* ref);