27
27
import java .io .FileOutputStream ;
28
28
import java .io .IOException ;
29
29
import java .io .OutputStream ;
30
- import java .lang .ref .WeakReference ;
31
30
import java .text .SimpleDateFormat ;
32
31
import java .util .ArrayList ;
33
32
import java .util .HashMap ;
@@ -73,6 +72,12 @@ public class SQLiteDatabase extends SQLiteClosable {
73
72
private static final int EVENT_DB_OPERATION = 52000 ;
74
73
private static final int EVENT_DB_CORRUPT = 75004 ;
75
74
75
+ // Stores reference to all databases opened in the current process.
76
+ // (The referent Object is not used at this time.)
77
+ // INVARIANT: Guarded by sActiveDatabases.
78
+ private static WeakHashMap <SQLiteDatabase , Object > sActiveDatabases =
79
+ new WeakHashMap <SQLiteDatabase , Object >();
80
+
76
81
public int status (int operation , boolean reset ){
77
82
return native_status (operation , reset );
78
83
}
@@ -394,6 +399,10 @@ protected void onAllReferencesReleased() {
394
399
mTimeClosed = getTime ();
395
400
}
396
401
dbclose ();
402
+
403
+ synchronized (sActiveDatabases ) {
404
+ sActiveDatabases .remove (this );
405
+ }
397
406
}
398
407
}
399
408
@@ -958,6 +967,7 @@ public static SQLiteDatabase openDatabase(String path, String password, CursorFa
958
967
*/
959
968
public static SQLiteDatabase openDatabase (String path , char [] password , CursorFactory factory , int flags , SQLiteDatabaseHook hook ) {
960
969
SQLiteDatabase sqliteDatabase = null ;
970
+
961
971
try {
962
972
// Open the database.
963
973
sqliteDatabase = new SQLiteDatabase (path , password , factory , flags , hook );
@@ -978,7 +988,10 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
978
988
}
979
989
sqliteDatabase = new SQLiteDatabase (path , password , factory , flags , hook );
980
990
}
981
- ActiveDatabases .getInstance ().mActiveDatabases .add (new WeakReference <SQLiteDatabase >(sqliteDatabase ));
991
+
992
+ synchronized (sActiveDatabases ) {
993
+ sActiveDatabases .put (sqliteDatabase , null );
994
+ }
982
995
return sqliteDatabase ;
983
996
}
984
997
@@ -2335,25 +2348,18 @@ public synchronized void setMaxSqlCacheSize(int cacheSize) {
2335
2348
mMaxSqlCacheSize = cacheSize ;
2336
2349
}
2337
2350
2338
- static class ActiveDatabases {
2339
- private static final ActiveDatabases activeDatabases = new ActiveDatabases ();
2340
- private HashSet <WeakReference <SQLiteDatabase >> mActiveDatabases =
2341
- new HashSet <WeakReference <SQLiteDatabase >>();
2342
- private ActiveDatabases () {} // disable instantiation of this class
2343
- static ActiveDatabases getInstance () {return activeDatabases ;}
2344
- }
2345
-
2346
2351
/**
2347
2352
* this method is used to collect data about ALL open databases in the current process.
2348
2353
* bugreport is a user of this data.
2349
2354
*/
2350
2355
/* package */ static ArrayList <DbStats > getDbStats () {
2351
2356
ArrayList <DbStats > dbStatsList = new ArrayList <DbStats >();
2352
- for ( WeakReference < SQLiteDatabase > w : ActiveDatabases . getInstance (). mActiveDatabases ) {
2353
- SQLiteDatabase db = w . get ();
2357
+
2358
+ for ( SQLiteDatabase db : getActiveDatabases ()) {
2354
2359
if (db == null || !db .isOpen ()) {
2355
2360
continue ;
2356
2361
}
2362
+
2357
2363
// get SQLITE_DBSTATUS_LOOKASIDE_USED for the db
2358
2364
int lookasideUsed = db .native_getDbLookaside ();
2359
2365
@@ -2395,6 +2401,14 @@ private ActiveDatabases() {} // disable instantiation of this class
2395
2401
return dbStatsList ;
2396
2402
}
2397
2403
2404
+ private static ArrayList <SQLiteDatabase > getActiveDatabases () {
2405
+ ArrayList <SQLiteDatabase > databases = new ArrayList <SQLiteDatabase >();
2406
+ synchronized (sActiveDatabases ) {
2407
+ databases .addAll (sActiveDatabases .keySet ());
2408
+ }
2409
+ return databases ;
2410
+ }
2411
+
2398
2412
/**
2399
2413
* get the specified pragma value from sqlite for the specified database.
2400
2414
* only handles pragma's that return int/long.
0 commit comments