summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-10-09 14:07:00 -0700
committerJeff Brown <jeffbrown@google.com>2011-10-09 15:01:10 -0700
commitbaaf8c3f55d9d95b9d2cd9279e2ce1725da0dc52 (patch)
tree606f2a0aa73bd9bcf0b55c2b45cbb5363a69d845
parentdf6611d8c0cd69c3dcb93462eb138e0bbf137b88 (diff)
downloadframeworks_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
-rw-r--r--core/java/android/content/ContentResolver.java25
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();