| Index: Source/modules/webdatabase/SQLTransactionCoordinator.cpp
|
| diff --git a/Source/modules/webdatabase/SQLTransactionCoordinator.cpp b/Source/modules/webdatabase/SQLTransactionCoordinator.cpp
|
| index e086aaf9aab0f2d8d8c22ade40edda07aa2a80e0..133af38cf2717c47ad3f2df8b473ad54c2ab1e38 100644
|
| --- a/Source/modules/webdatabase/SQLTransactionCoordinator.cpp
|
| +++ b/Source/modules/webdatabase/SQLTransactionCoordinator.cpp
|
| @@ -54,7 +54,7 @@ void SQLTransactionCoordinator::processPendingTransactions(CoordinationInfo& inf
|
| if (info.activeWriteTransaction || info.pendingTransactions.isEmpty())
|
| return;
|
|
|
| - RefPtr<SQLTransactionBackend> firstPendingTransaction = info.pendingTransactions.first();
|
| + RefPtrWillBeRawPtr<SQLTransactionBackend> firstPendingTransaction = info.pendingTransactions.first();
|
| if (firstPendingTransaction->isReadOnly()) {
|
| do {
|
| firstPendingTransaction = info.pendingTransactions.takeFirst();
|
| @@ -74,16 +74,16 @@ void SQLTransactionCoordinator::acquireLock(SQLTransactionBackend* transaction)
|
|
|
| String dbIdentifier = getDatabaseIdentifier(transaction);
|
|
|
| - CoordinationInfoMap::iterator coordinationInfoIterator = m_coordinationInfoMap.find(dbIdentifier);
|
| + CoordinationInfoHeapMap::iterator coordinationInfoIterator = m_coordinationInfoMap.find(dbIdentifier);
|
| if (coordinationInfoIterator == m_coordinationInfoMap.end()) {
|
| // No pending transactions for this DB
|
| - CoordinationInfo& info = m_coordinationInfoMap.add(dbIdentifier, CoordinationInfo()).storedValue->value;
|
| - info.pendingTransactions.append(transaction);
|
| - processPendingTransactions(info);
|
| + CoordinationInfo* info = m_coordinationInfoMap.add(dbIdentifier, CoordinationInfo::create()).storedValue->value.get();
|
| + info->pendingTransactions.append(transaction);
|
| + processPendingTransactions(*info);
|
| } else {
|
| - CoordinationInfo& info = coordinationInfoIterator->value;
|
| - info.pendingTransactions.append(transaction);
|
| - processPendingTransactions(info);
|
| + CoordinationInfo* info = coordinationInfoIterator->value.get();
|
| + info->pendingTransactions.append(transaction);
|
| + processPendingTransactions(*info);
|
| }
|
|
|
| }
|
| @@ -95,19 +95,19 @@ void SQLTransactionCoordinator::releaseLock(SQLTransactionBackend* transaction)
|
|
|
| String dbIdentifier = getDatabaseIdentifier(transaction);
|
|
|
| - CoordinationInfoMap::iterator coordinationInfoIterator = m_coordinationInfoMap.find(dbIdentifier);
|
| + CoordinationInfoHeapMap::iterator coordinationInfoIterator = m_coordinationInfoMap.find(dbIdentifier);
|
| ASSERT_WITH_SECURITY_IMPLICATION(coordinationInfoIterator != m_coordinationInfoMap.end());
|
| - CoordinationInfo& info = coordinationInfoIterator->value;
|
| + CoordinationInfo* info = coordinationInfoIterator->value.get();
|
|
|
| if (transaction->isReadOnly()) {
|
| - ASSERT(info.activeReadTransactions.contains(transaction));
|
| - info.activeReadTransactions.remove(transaction);
|
| + ASSERT(info->activeReadTransactions.contains(transaction));
|
| + info->activeReadTransactions.remove(transaction);
|
| } else {
|
| - ASSERT(info.activeWriteTransaction == transaction);
|
| - info.activeWriteTransaction = nullptr;
|
| + ASSERT(info->activeWriteTransaction == transaction);
|
| + info->activeWriteTransaction = nullptr;
|
| }
|
|
|
| - processPendingTransactions(info);
|
| + processPendingTransactions(*info);
|
| }
|
|
|
| void SQLTransactionCoordinator::shutdown()
|
| @@ -117,27 +117,27 @@ void SQLTransactionCoordinator::shutdown()
|
| m_isShuttingDown = true;
|
|
|
| // Notify all transactions in progress that the database thread is shutting down
|
| - for (CoordinationInfoMap::iterator coordinationInfoIterator = m_coordinationInfoMap.begin();
|
| + for (CoordinationInfoHeapMap::iterator coordinationInfoIterator = m_coordinationInfoMap.begin();
|
| coordinationInfoIterator != m_coordinationInfoMap.end(); ++coordinationInfoIterator) {
|
| - CoordinationInfo& info = coordinationInfoIterator->value;
|
| + CoordinationInfo* info = coordinationInfoIterator->value.get();
|
|
|
| // Clean up transactions that have reached "lockAcquired":
|
| // Transaction phase 4 cleanup. See comment on "What happens if a
|
| // transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
|
| - if (info.activeWriteTransaction)
|
| - info.activeWriteTransaction->notifyDatabaseThreadIsShuttingDown();
|
| - for (HashSet<RefPtr<SQLTransactionBackend> >::iterator activeReadTransactionsIterator =
|
| - info.activeReadTransactions.begin();
|
| - activeReadTransactionsIterator != info.activeReadTransactions.end();
|
| - ++activeReadTransactionsIterator) {
|
| + if (info->activeWriteTransaction)
|
| + info->activeWriteTransaction->notifyDatabaseThreadIsShuttingDown();
|
| + for (WillBeHeapHashSet<RefPtrWillBeMember<SQLTransactionBackend> >::iterator activeReadTransactionsIterator =
|
| + info->activeReadTransactions.begin();
|
| + activeReadTransactionsIterator != info->activeReadTransactions.end();
|
| + ++activeReadTransactionsIterator) {
|
| (*activeReadTransactionsIterator)->notifyDatabaseThreadIsShuttingDown();
|
| }
|
|
|
| // Clean up transactions that have NOT reached "lockAcquired":
|
| // Transaction phase 3 cleanup. See comment on "What happens if a
|
| // transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
|
| - while (!info.pendingTransactions.isEmpty()) {
|
| - RefPtr<SQLTransactionBackend> transaction = info.pendingTransactions.first();
|
| + while (!info->pendingTransactions.isEmpty()) {
|
| + RefPtrWillBeRawPtr<SQLTransactionBackend> transaction = info->pendingTransactions.first();
|
| transaction->notifyDatabaseThreadIsShuttingDown();
|
| }
|
| }
|
|
|