summaryrefslogtreecommitdiffstats
path: root/core/java/android/content
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 /core/java/android/content
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
Diffstat (limited to 'core/java/android/content')
-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();