From baaf8c3f55d9d95b9d2cd9279e2ce1725da0dc52 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Sun, 9 Oct 2011 14:07:00 -0700 Subject: [PATCH] Implement CloseGuard in ContentResolver. Also, don't try to close the cursor from the finalizer, it just won't work because quite probably the Binder underneath it has already been finalized or is about to be. Change-Id: I6363cd30f32abe15412948d126e0bcc5f62943c5 --- .../java/android/content/ContentResolver.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 1e720929bbf4f..0d25926265fc0 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -16,6 +16,8 @@ package android.content; +import dalvik.system.CloseGuard; + import android.accounts.Account; import android.app.ActivityManagerNative; import android.app.ActivityThread; @@ -33,6 +35,7 @@ import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.StrictMode; import android.os.SystemClock; import android.text.TextUtils; import android.util.EventLog; @@ -1562,27 +1565,39 @@ public abstract class ContentResolver { private final class CursorWrapperInner extends CursorWrapper { private final IContentProvider mContentProvider; public static final String TAG="CursorWrapperInner"; - private boolean mCloseFlag = false; + + private final CloseGuard mCloseGuard = CloseGuard.get(); + private boolean mProviderReleased; CursorWrapperInner(Cursor cursor, IContentProvider icp) { super(cursor); mContentProvider = icp; + mCloseGuard.open("close"); } @Override public void close() { super.close(); ContentResolver.this.releaseProvider(mContentProvider); - mCloseFlag = true; + mProviderReleased = true; + + if (mCloseGuard != null) { + mCloseGuard.close(); + } } @Override protected void finalize() throws Throwable { - // TODO: integrate CloseGuard support. try { - if(!mCloseFlag) { + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + + if (!mProviderReleased && mContentProvider != null) { + // Even though we are using CloseGuard, log this anyway so that + // application developers always see the message in the log. Log.w(TAG, "Cursor finalized without prior close()"); - close(); + ContentResolver.this.releaseProvider(mContentProvider); } } finally { super.finalize();