summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/database/BulkCursorToCursorAdaptor.java5
-rw-r--r--core/java/android/database/CursorWindow.java21
2 files changed, 21 insertions, 5 deletions
diff --git a/core/java/android/database/BulkCursorToCursorAdaptor.java b/core/java/android/database/BulkCursorToCursorAdaptor.java
index 2cb2aec..16becf5 100644
--- a/core/java/android/database/BulkCursorToCursorAdaptor.java
+++ b/core/java/android/database/BulkCursorToCursorAdaptor.java
@@ -154,7 +154,10 @@ public final class BulkCursorToCursorAdaptor extends AbstractWindowedCursor {
false /* the window will be accessed across processes */));
if (mCount != -1) {
mPos = -1;
- mWindow = null;
+ if (mWindow != null) {
+ mWindow.close();
+ mWindow = null;
+ }
// super.requery() will call onChanged. Do it here instead of relying on the
// observer from the far side so that observers can see a correct value for mCount
diff --git a/core/java/android/database/CursorWindow.java b/core/java/android/database/CursorWindow.java
index d15fb88..bd78063 100644
--- a/core/java/android/database/CursorWindow.java
+++ b/core/java/android/database/CursorWindow.java
@@ -17,12 +17,14 @@
package android.database;
import android.content.res.Resources;
+import android.database.sqlite.DatabaseObjectNotClosedException;
import android.database.sqlite.SQLiteClosable;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
+import android.os.StrictMode;
import android.util.Log;
import android.util.SparseIntArray;
@@ -45,6 +47,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
private int nWindow;
private int mStartPos;
+ private final Throwable mStackTrace;
/**
* Creates a new empty window.
@@ -56,6 +59,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
int rslt = native_init(sCursorWindowSize, localWindow);
printDebugMsgIfError(rslt);
recordNewWindow(Binder.getCallingPid(), nWindow);
+ mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace();
}
private void printDebugMsgIfError(int rslt) {
@@ -561,7 +565,16 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
@Override
protected void finalize() {
- // Just in case someone forgot to call close...
+ if (nWindow == 0) {
+ return;
+ }
+ if (StrictMode.vmSqliteObjectLeaksEnabled()) {
+ StrictMode.onSqliteObjectLeaked(
+ "Releasing cursor in a finalizer. Please ensure " +
+ "that you explicitly call close() on your cursor: ",
+ mStackTrace);
+ }
+ recordClosingOfWindow(nWindow);
close_native();
}
@@ -593,6 +606,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
IBinder nativeBinder = source.readStrongBinder();
mStartPos = source.readInt();
int rslt = native_init(nativeBinder);
+ mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace();
printDebugMsgIfError(rslt);
}
@@ -607,8 +621,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
@Override
protected void onAllReferencesReleased() {
- int windowId = nWindow;
- recordClosingOfWindow(Binder.getCallingPid(), nWindow);
+ recordClosingOfWindow(nWindow);
close_native();
}
@@ -623,7 +636,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
}
}
- private void recordClosingOfWindow(int pid, int window) {
+ private void recordClosingOfWindow(int window) {
synchronized (sWindowToPidMap) {
if (sWindowToPidMap.size() == 0) {
// this means we are not in the ContentProvider.