summaryrefslogtreecommitdiffstats
path: root/graphics
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2010-08-06 17:58:44 -0700
committerRomain Guy <romainguy@google.com>2010-08-09 09:44:40 -0700
commit02890fd0f98b3b8d98baf0bda1ea906afd723d8b (patch)
tree72779a2551fc4a6c09c4047832d8bf1434213844 /graphics
parent8576301c38381b0b06c0c804e2d638fabf408f8c (diff)
downloadframeworks_base-02890fd0f98b3b8d98baf0bda1ea906afd723d8b.zip
frameworks_base-02890fd0f98b3b8d98baf0bda1ea906afd723d8b.tar.gz
frameworks_base-02890fd0f98b3b8d98baf0bda1ea906afd723d8b.tar.bz2
Replace Bitmap's finalizers with PhantomReferences.
This change also removes the use of SoftReferences for View's drawing cache. A bitmap now creates a PhantomReference enqueued in a reference queue provided by the new Finalizers class. This queue is polled from a thread started after forking zygote. That thread is in charge of clearing the references after GC runs and of calling reclaim() on them. The reclaim() method is now how finalizers are run. Note that a PhantomReference cannot be kept in the instance it refers to, which is why they are kept in a separate List. Change-Id: If3c1a5e9dc23fa49e34857860d730f5cf5ad5926
Diffstat (limited to 'graphics')
-rw-r--r--graphics/java/android/graphics/Bitmap.java36
1 files changed, 28 insertions, 8 deletions
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 537dd3a..d9ee3ec 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -19,12 +19,16 @@ package android.graphics;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.DisplayMetrics;
+import android.util.Finalizers;
import java.io.OutputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
public final class Bitmap implements Parcelable {
/**
@@ -55,7 +59,7 @@ public final class Bitmap implements Parcelable {
private static volatile Matrix sScaleMatrix;
private static volatile int sDefaultDensity = -1;
-
+
/**
* For backwards compatibility, allows the app layer to change the default
* density when running old apps.
@@ -81,8 +85,7 @@ public final class Bitmap implements Parcelable {
This can be called from JNI code.
*/
- private Bitmap(int nativeBitmap, boolean isMutable, byte[] ninePatchChunk,
- int density) {
+ private Bitmap(int nativeBitmap, boolean isMutable, byte[] ninePatchChunk, int density) {
if (nativeBitmap == 0) {
throw new RuntimeException("internal error: native bitmap is 0");
}
@@ -94,6 +97,13 @@ public final class Bitmap implements Parcelable {
if (density >= 0) {
mDensity = density;
}
+
+ // If the finalizers queue is null, we are running in zygote and the
+ // bitmap will never be reclaimed, so we don't need to run our native
+ // destructor
+ if (Finalizers.getQueue() != null) {
+ new BitmapFinalizer(this);
+ }
}
/**
@@ -1016,12 +1026,22 @@ public final class Bitmap implements Parcelable {
nativePrepareToDraw(mNativeBitmap);
}
- @Override
- protected void finalize() throws Throwable {
- try {
+ private static class BitmapFinalizer extends Finalizers.ReclaimableReference<Bitmap> {
+ private static final Set<BitmapFinalizer> sFinalizers = Collections.synchronizedSet(
+ new HashSet<BitmapFinalizer>());
+
+ private int mNativeBitmap;
+
+ BitmapFinalizer(Bitmap b) {
+ super(b, Finalizers.getQueue());
+ mNativeBitmap = b.mNativeBitmap;
+ sFinalizers.add(this);
+ }
+
+ @Override
+ public void reclaim() {
nativeDestructor(mNativeBitmap);
- } finally {
- super.finalize();
+ sFinalizers.remove(this);
}
}