diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-10-09 14:07:00 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-10-09 15:01:10 -0700 |
commit | baaf8c3f55d9d95b9d2cd9279e2ce1725da0dc52 (patch) | |
tree | 606f2a0aa73bd9bcf0b55c2b45cbb5363a69d845 /core/java/android/content | |
parent | df6611d8c0cd69c3dcb93462eb138e0bbf137b88 (diff) | |
download | frameworks_base-baaf8c3f55d9d95b9d2cd9279e2ce1725da0dc52.zip frameworks_base-baaf8c3f55d9d95b9d2cd9279e2ce1725da0dc52.tar.gz frameworks_base-baaf8c3f55d9d95b9d2cd9279e2ce1725da0dc52.tar.bz2 |
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
Diffstat (limited to 'core/java/android/content')
-rw-r--r-- | core/java/android/content/ContentResolver.java | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 1e72092..0d25926 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(); |