| Index: third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
|
| diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
|
| index d49a6126d75856b6990f8cceab7f08f828acedd4..5c505111f40067732fb13148d9b8a62d901fa7a1 100644
|
| --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
|
| +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
|
| @@ -45,17 +45,17 @@ DatabaseThread::DatabaseThread()
|
| , m_cleanupSync(nullptr)
|
| , m_terminationRequested(false)
|
| {
|
| + ASSERT(isMainThread());
|
| }
|
|
|
| DatabaseThread::~DatabaseThread()
|
| {
|
| - ASSERT(m_openDatabaseSet.isEmpty());
|
| + ASSERT(!m_openDatabaseSet);
|
| ASSERT(!m_thread);
|
| }
|
|
|
| DEFINE_TRACE(DatabaseThread)
|
| {
|
| - visitor->trace(m_openDatabaseSet);
|
| visitor->trace(m_transactionCoordinator);
|
| }
|
|
|
| @@ -64,7 +64,7 @@ void DatabaseThread::start()
|
| ASSERT(isMainThread());
|
| if (m_thread)
|
| return;
|
| - m_thread = WebThreadSupportingGC::create("WebCore: Database");
|
| + m_thread = WebThreadSupportingGC::create("WebCore: Database", true);
|
| m_thread->postTask(BLINK_FROM_HERE, threadSafeBind(&DatabaseThread::setupDatabaseThread, this));
|
| }
|
|
|
| @@ -94,6 +94,8 @@ void DatabaseThread::terminate()
|
|
|
| void DatabaseThread::cleanupDatabaseThread()
|
| {
|
| + ASSERT(isDatabaseThread());
|
| +
|
| WTF_LOG(StorageAPI, "Cleaning up DatabaseThread %p", this);
|
|
|
| // Clean up the list of all pending transactions on this database thread
|
| @@ -101,15 +103,15 @@ void DatabaseThread::cleanupDatabaseThread()
|
|
|
| // Close the databases that we ran transactions on. This ensures that if any transactions are still open, they are rolled back and we don't leave the database in an
|
| // inconsistent or locked state.
|
| - if (m_openDatabaseSet.size() > 0) {
|
| + if (m_openDatabaseSet) {
|
| // As the call to close will modify the original set, we must take a copy to iterate over.
|
| - HeapHashSet<Member<Database>> openSetCopy;
|
| - openSetCopy.swap(m_openDatabaseSet);
|
| - HeapHashSet<Member<Database>>::iterator end = openSetCopy.end();
|
| - for (HeapHashSet<Member<Database>>::iterator it = openSetCopy.begin(); it != end; ++it)
|
| + HashSet<CrossThreadPersistent<Database>> openSetCopy;
|
| + openSetCopy.swap(*m_openDatabaseSet);
|
| + HashSet<CrossThreadPersistent<Database>>::iterator end = openSetCopy.end();
|
| + for (HashSet<CrossThreadPersistent<Database>>::iterator it = openSetCopy.begin(); it != end; ++it)
|
| (*it)->close();
|
| + m_openDatabaseSet = nullptr;
|
| }
|
| - m_openDatabaseSet.clear();
|
|
|
| m_thread->postTask(BLINK_FROM_HERE, WTF::bind(&DatabaseThread::cleanupDatabaseThreadCompleted, this));
|
| }
|
| @@ -125,10 +127,12 @@ void DatabaseThread::recordDatabaseOpen(Database* database)
|
| {
|
| ASSERT(isDatabaseThread());
|
| ASSERT(database);
|
| - ASSERT(!m_openDatabaseSet.contains(database));
|
| + if (!m_openDatabaseSet)
|
| + m_openDatabaseSet = adoptPtr(new HashSet<CrossThreadPersistent<Database>>());
|
| + ASSERT(!m_openDatabaseSet->contains(database));
|
| MutexLocker lock(m_terminationRequestedMutex);
|
| if (!m_terminationRequested)
|
| - m_openDatabaseSet.add(database);
|
| + m_openDatabaseSet->add(database);
|
| }
|
|
|
| void DatabaseThread::recordDatabaseClosed(Database* database)
|
| @@ -138,10 +142,14 @@ void DatabaseThread::recordDatabaseClosed(Database* database)
|
| #if ENABLE(ASSERT)
|
| {
|
| MutexLocker lock(m_terminationRequestedMutex);
|
| - ASSERT(m_terminationRequested || m_openDatabaseSet.contains(database));
|
| + ASSERT(m_terminationRequested || m_openDatabaseSet->contains(database));
|
| }
|
| #endif
|
| - m_openDatabaseSet.remove(database);
|
| + if (!m_openDatabaseSet) {
|
| + m_openDatabaseSet->remove(database);
|
| + if (m_openDatabaseSet->isEmpty())
|
| + m_openDatabaseSet = nullptr;
|
| + }
|
| }
|
|
|
| bool DatabaseThread::isDatabaseOpen(Database* database)
|
| @@ -149,7 +157,7 @@ bool DatabaseThread::isDatabaseOpen(Database* database)
|
| ASSERT(isDatabaseThread());
|
| ASSERT(database);
|
| MutexLocker lock(m_terminationRequestedMutex);
|
| - return !m_terminationRequested && m_openDatabaseSet.contains(database);
|
| + return !m_terminationRequested && m_openDatabaseSet->contains(database);
|
| }
|
|
|
| bool DatabaseThread::isDatabaseThread() const
|
|
|