diff options
-rw-r--r-- | core/java/android/database/sqlite/SQLiteCompiledSql.java | 5 | ||||
-rw-r--r-- | core/java/android/database/sqlite/SQLiteDatabase.java | 11 |
2 files changed, 16 insertions, 0 deletions
diff --git a/core/java/android/database/sqlite/SQLiteCompiledSql.java b/core/java/android/database/sqlite/SQLiteCompiledSql.java index feea47e..bdb96b1 100644 --- a/core/java/android/database/sqlite/SQLiteCompiledSql.java +++ b/core/java/android/database/sqlite/SQLiteCompiledSql.java @@ -103,6 +103,11 @@ import android.util.Log; protected void finalize() throws Throwable { try { if (nStatement == 0) return; + // don't worry about finalizing this object if it is ALREADY in the + // queue of statements to be finalized later + if (mDatabase.isInQueueOfStatementsToBeFinalized(nStatement)) { + return; + } // finalizer should NEVER get called // but if the database itself is not closed and is GC'ed, then // all sub-objects attached to the database could end up getting GC'ed too. diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index b3fd914..8c5483f 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -2274,6 +2274,17 @@ public class SQLiteDatabase extends SQLiteClosable { } } + /* package */ boolean isInQueueOfStatementsToBeFinalized(int id) { + if (!isOpen()) { + // database already closed. this statement will already have been finalized. + // return true so that the caller doesn't have to worry about finalizing this statement. + return true; + } + synchronized(mClosedStatementIds) { + return mClosedStatementIds.contains(id); + } + } + /* package */ void closePendingStatements() { if (!isOpen()) { // since this database is already closed, no need to finalize anything. |