author | Simon Giesecke <sgiesecke@mozilla.com> |
Wed, 18 Nov 2020 08:58:37 +0000 | |
changeset 557797 | 785624cc9edfc68ebc6428f8a3cac45fdeb74383 |
parent 557796 | 84bf4201587c74c3d16bf30f87417149713c40ed |
child 557798 | 72e7d30ced00970f4d717f12ce3a01f5d202d1be |
push id | 37962 |
push user | apavel@mozilla.com |
push date | Wed, 18 Nov 2020 21:51:58 +0000 |
treeherder | mozilla-central@9d797387f57c [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | dom-workers-and-storage-reviewers, ttung |
bugs | 1663924 |
milestone | 85.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -14150,64 +14150,64 @@ void Maintenance::Finish() { } NS_IMPL_ISUPPORTS_INHERITED0(Maintenance, Runnable) NS_IMETHODIMP Maintenance::Run() { MOZ_ASSERT(mState != State::Complete); - nsresult rv; + const auto handleError = [this](const nsresult rv) { + if (mState != State::Finishing) { + if (NS_SUCCEEDED(mResultCode)) { + mResultCode = rv; + } + + // Must set mState before dispatching otherwise we will race with the + // owning thread. + mState = State::Finishing; + + if (IsOnBackgroundThread()) { + Finish(); + } else { + MOZ_ALWAYS_SUCCEEDS(mQuotaClient->BackgroundThread()->Dispatch( + this, NS_DISPATCH_NORMAL)); + } + } + }; switch (mState) { case State::Initial: - rv = Start(); + IDB_TRY(Start(), NS_OK, handleError); break; case State::CreateIndexedDatabaseManager: - rv = CreateIndexedDatabaseManager(); + IDB_TRY(CreateIndexedDatabaseManager(), NS_OK, handleError); break; case State::IndexedDatabaseManagerOpen: - rv = OpenDirectory(); + IDB_TRY(OpenDirectory(), NS_OK, handleError); break; case State::DirectoryWorkOpen: - rv = DirectoryWork(); + IDB_TRY(DirectoryWork(), NS_OK, handleError); break; case State::BeginDatabaseMaintenance: - rv = BeginDatabaseMaintenance(); + IDB_TRY(BeginDatabaseMaintenance(), NS_OK, handleError); break; case State::Finishing: Finish(); - return NS_OK; + break; default: MOZ_CRASH("Bad state!"); } - if (NS_WARN_IF(NS_FAILED(rv)) && mState != State::Finishing) { - if (NS_SUCCEEDED(mResultCode)) { - mResultCode = rv; - } - - // Must set mState before dispatching otherwise we will race with the owning - // thread. - mState = State::Finishing; - - if (IsOnBackgroundThread()) { - Finish(); - } else { - MOZ_ALWAYS_SUCCEEDS( - mQuotaClient->BackgroundThread()->Dispatch(this, NS_DISPATCH_NORMAL)); - } - } - return NS_OK; } void Maintenance::DirectoryLockAcquired(DirectoryLock* aLock) { AssertIsOnBackgroundThread(); MOZ_ASSERT(mState == State::DirectoryOpenPending); MOZ_ASSERT(!mDirectoryLock);