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 |