Bug 1617170 - Remove some local helper classes. r=dom-workers-and-storage-reviewers,janv

Differential Revision: https://phabricator.services.mozilla.com/D64343

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Simon Giesecke 2020-03-11 16:49:15 +00:00
Родитель f28bafa279
Коммит d8537d4388
2 изменённых файлов: 81 добавлений и 102 удалений

Просмотреть файл

@ -695,85 +695,72 @@ void IDBDatabase::UnregisterTransaction(IDBTransaction* aTransaction) {
void IDBDatabase::AbortTransactions(bool aShouldWarn) {
AssertIsOnOwningThread();
class MOZ_STACK_CLASS Helper final {
typedef AutoTArray<RefPtr<IDBTransaction>, 20> StrongTransactionArray;
typedef AutoTArray<IDBTransaction*, 20> WeakTransactionArray;
constexpr size_t StackExceptionLimit = 20;
using StrongTransactionArray =
AutoTArray<RefPtr<IDBTransaction>, StackExceptionLimit>;
using WeakTransactionArray = AutoTArray<IDBTransaction*, StackExceptionLimit>;
public:
static void AbortTransactions(IDBDatabase* aDatabase,
const bool aShouldWarn) {
MOZ_ASSERT(aDatabase);
aDatabase->AssertIsOnOwningThread();
if (!mTransactions.Count()) {
// Return early as an optimization, the remainder is a no-op in this
// case.
return;
}
nsTHashtable<nsPtrHashKey<IDBTransaction>>& transactionTable =
aDatabase->mTransactions;
StrongTransactionArray transactionsToAbort;
transactionsToAbort.SetCapacity(mTransactions.Count());
if (!transactionTable.Count()) {
// Return early as an optimization, the remainder is a no-op in this
// case.
return;
}
for (auto iter = mTransactions.ConstIter(); !iter.Done(); iter.Next()) {
IDBTransaction* transaction = iter.Get()->GetKey();
MOZ_ASSERT(transaction);
StrongTransactionArray transactionsToAbort;
transactionsToAbort.SetCapacity(transactionTable.Count());
transaction->AssertIsOnOwningThread();
for (auto iter = transactionTable.Iter(); !iter.Done(); iter.Next()) {
IDBTransaction* transaction = iter.Get()->GetKey();
MOZ_ASSERT(transaction);
transaction->AssertIsOnOwningThread();
// Transactions that are already done can simply be ignored. Otherwise
// there is a race here and it's possible that the transaction has not
// been successfully committed yet so we will warn the user.
if (!transaction->IsFinished()) {
transactionsToAbort.AppendElement(transaction);
}
}
MOZ_ASSERT(transactionsToAbort.Length() <= transactionTable.Count());
if (transactionsToAbort.IsEmpty()) {
// Return early as an optimization, the remainder is a no-op in this
// case.
return;
}
// We want to abort transactions as soon as possible so we iterate the
// transactions once and abort them all first, collecting the transactions
// that need to have a warning issued along the way. Those that need a
// warning will be a subset of those that are aborted, so we don't need
// additional strong references here.
WeakTransactionArray transactionsThatNeedWarning;
for (const auto& transaction : transactionsToAbort) {
MOZ_ASSERT(transaction);
MOZ_ASSERT(!transaction->IsFinished());
// We warn for any transactions that could have written data, but
// ignore read-only transactions.
if (aShouldWarn && transaction->IsWriteAllowed()) {
transactionsThatNeedWarning.AppendElement(transaction);
}
transaction->Abort(NS_ERROR_DOM_INDEXEDDB_ABORT_ERR);
}
static const char kWarningMessage[] =
"IndexedDBTransactionAbortNavigation";
for (IDBTransaction* transaction : transactionsThatNeedWarning) {
MOZ_ASSERT(transaction);
nsString filename;
uint32_t lineNo, column;
transaction->GetCallerLocation(filename, &lineNo, &column);
aDatabase->LogWarning(kWarningMessage, filename, lineNo, column);
}
// Transactions that are already done can simply be ignored. Otherwise
// there is a race here and it's possible that the transaction has not
// been successfully committed yet so we will warn the user.
if (!transaction->IsFinished()) {
transactionsToAbort.AppendElement(transaction);
}
};
}
MOZ_ASSERT(transactionsToAbort.Length() <= mTransactions.Count());
Helper::AbortTransactions(this, aShouldWarn);
if (transactionsToAbort.IsEmpty()) {
// Return early as an optimization, the remainder is a no-op in this
// case.
return;
}
// We want to abort transactions as soon as possible so we iterate the
// transactions once and abort them all first, collecting the transactions
// that need to have a warning issued along the way. Those that need a
// warning will be a subset of those that are aborted, so we don't need
// additional strong references here.
WeakTransactionArray transactionsThatNeedWarning;
for (const auto& transaction : transactionsToAbort) {
MOZ_ASSERT(transaction);
MOZ_ASSERT(!transaction->IsFinished());
// We warn for any transactions that could have written data, but
// ignore read-only transactions.
if (aShouldWarn && transaction->IsWriteAllowed()) {
transactionsThatNeedWarning.AppendElement(transaction);
}
transaction->Abort(NS_ERROR_DOM_INDEXEDDB_ABORT_ERR);
}
static const char kWarningMessage[] = "IndexedDBTransactionAbortNavigation";
for (IDBTransaction* transaction : transactionsThatNeedWarning) {
MOZ_ASSERT(transaction);
nsString filename;
uint32_t lineNo, column;
transaction->GetCallerLocation(filename, &lineNo, &column);
LogWarning(kWarningMessage, filename, lineNo, column);
}
}
PBackgroundIDBDatabaseFileChild* IDBDatabase::GetOrCreateFileActorForBlob(

Просмотреть файл

@ -112,42 +112,34 @@ void IDBMutableFile::UnregisterFileHandle(IDBFileHandle* aFileHandle) {
void IDBMutableFile::AbortFileHandles() {
AssertIsOnOwningThread();
class MOZ_STACK_CLASS Helper final {
public:
static void AbortFileHandles(
const nsTHashtable<nsPtrHashKey<IDBFileHandle>>& aTable) {
if (!aTable.Count()) {
return;
}
if (!mFileHandles.Count()) {
return;
}
nsTArray<RefPtr<IDBFileHandle>> fileHandlesToAbort;
fileHandlesToAbort.SetCapacity(aTable.Count());
nsTArray<RefPtr<IDBFileHandle>> fileHandlesToAbort;
fileHandlesToAbort.SetCapacity(mFileHandles.Count());
for (auto iter = aTable.ConstIter(); !iter.Done(); iter.Next()) {
IDBFileHandle* const fileHandle = iter.Get()->GetKey();
MOZ_ASSERT(fileHandle);
for (auto iter = mFileHandles.ConstIter(); !iter.Done(); iter.Next()) {
IDBFileHandle* const fileHandle = iter.Get()->GetKey();
MOZ_ASSERT(fileHandle);
fileHandle->AssertIsOnOwningThread();
fileHandle->AssertIsOnOwningThread();
if (!fileHandle->IsDone()) {
fileHandlesToAbort.AppendElement(iter.Get()->GetKey());
}
}
MOZ_ASSERT(fileHandlesToAbort.Length() <= aTable.Count());
if (fileHandlesToAbort.IsEmpty()) {
return;
}
for (const auto& fileHandle : fileHandlesToAbort) {
MOZ_ASSERT(fileHandle);
fileHandle->Abort();
}
if (!fileHandle->IsDone()) {
fileHandlesToAbort.AppendElement(iter.Get()->GetKey());
}
};
}
MOZ_ASSERT(fileHandlesToAbort.Length() <= mFileHandles.Count());
Helper::AbortFileHandles(mFileHandles);
if (fileHandlesToAbort.IsEmpty()) {
return;
}
for (const auto& fileHandle : fileHandlesToAbort) {
MOZ_ASSERT(fileHandle);
fileHandle->Abort();
}
}
IDBDatabase* IDBMutableFile::Database() const {