| Index: Source/modules/webdatabase/DatabaseContext.cpp
|
| diff --git a/Source/modules/webdatabase/DatabaseContext.cpp b/Source/modules/webdatabase/DatabaseContext.cpp
|
| index 4a63b9c78518ea8291cb556da0bb08332dd7f9f8..ec01219a4f5f62df6696b9855ecc38f75543a8e8 100644
|
| --- a/Source/modules/webdatabase/DatabaseContext.cpp
|
| +++ b/Source/modules/webdatabase/DatabaseContext.cpp
|
| @@ -170,17 +170,30 @@ void DatabaseContext::didOpenDatabase(DatabaseBackendBase& database)
|
| if (!database.isSyncDatabase())
|
| return;
|
| ASSERT(isContextThread());
|
| +#if ENABLE(OILPAN)
|
| + m_openSyncDatabases.add(&database, adoptPtr(new DatabaseCloser(database)));
|
| +#else
|
| m_openSyncDatabases.add(&database);
|
| +#endif
|
| }
|
|
|
| void DatabaseContext::didCloseDatabase(DatabaseBackendBase& database)
|
| {
|
| +#if !ENABLE(OILPAN)
|
| if (!database.isSyncDatabase())
|
| return;
|
| ASSERT(isContextThread());
|
| m_openSyncDatabases.remove(&database);
|
| +#endif
|
| }
|
|
|
| +#if ENABLE(OILPAN)
|
| +DatabaseContext::DatabaseCloser::~DatabaseCloser()
|
| +{
|
| + m_database.closeImmediately();
|
| +}
|
| +#endif
|
| +
|
| void DatabaseContext::stopSyncDatabases()
|
| {
|
| // SQLite is "multi-thread safe", but each database handle can only be used
|
| @@ -191,11 +204,20 @@ void DatabaseContext::stopSyncDatabases()
|
| // thread. This means that the SQLite database need to be closed here in the
|
| // destructor.
|
| ASSERT(isContextThread());
|
| +#if ENABLE(OILPAN)
|
| + // FIXME: We need to clear OwnPtr<> in the HeapHashMap explicitly.
|
| + // HeapHashMap::clear() doesn't destruct values
|
| + // immediately. crbug.com/357113.
|
| + for (PersistentHeapHashMap<WeakMember<DatabaseBackendBase>, OwnPtr<DatabaseCloser> >::iterator i = m_openSyncDatabases.begin(); i != m_openSyncDatabases.end(); ++i)
|
| + (*i).value.clear();
|
| + m_openSyncDatabases.clear();
|
| +#else
|
| Vector<DatabaseBackendBase*> syncDatabases;
|
| copyToVector(m_openSyncDatabases, syncDatabases);
|
| m_openSyncDatabases.clear();
|
| for (size_t i = 0; i < syncDatabases.size(); ++i)
|
| syncDatabases[i]->closeImmediately();
|
| +#endif
|
| }
|
|
|
| void DatabaseContext::stopDatabases()
|
|
|