author | Simon Giesecke <sgiesecke@mozilla.com> |
Wed, 18 Nov 2020 08:56:14 +0000 | |
changeset 557795 | 73f3c4d57e87577ccc9d48e43cd2eb87cbd475ed |
parent 557794 | dafde9de150215cf1baf65dfec652f968f356440 |
child 557796 | 84bf4201587c74c3d16bf30f87417149713c40ed |
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 @@ -16101,78 +16101,78 @@ NS_IMPL_ISUPPORTS_INHERITED0(FactoryOp, // Run() assumes that the caller holds a strong reference to the object that // can't be cleared while Run() is being executed. // So if you call Run() directly (as opposed to dispatching to an event queue) // you need to make sure there's such a reference. // See bug 1356824 for more details. NS_IMETHODIMP FactoryOp::Run() { - nsresult rv; + const auto handleError = [this](const nsresult rv) { + if (mState != State::SendingResults) { + SetFailureCodeIfUnset(rv); + + // Must set mState before dispatching otherwise we will race with the + // owning thread. + mState = State::SendingResults; + + if (IsOnOwningThread()) { + SendResults(); + } else { + MOZ_ALWAYS_SUCCEEDS( + mOwningEventTarget->Dispatch(this, NS_DISPATCH_NORMAL)); + } + } + }; switch (mState) { case State::Initial: - rv = Open(); + IDB_TRY(Open(), NS_OK, handleError); break; case State::PermissionChallenge: - rv = ChallengePermission(); + IDB_TRY(ChallengePermission(), NS_OK, handleError); break; case State::PermissionRetry: - rv = RetryCheckPermission(); + IDB_TRY(RetryCheckPermission(), NS_OK, handleError); break; case State::FinishOpen: - rv = FinishOpen(); + IDB_TRY(FinishOpen(), NS_OK, handleError); break; case State::QuotaManagerPending: - rv = QuotaManagerOpen(); + IDB_TRY(QuotaManagerOpen(), NS_OK, handleError); break; case State::DatabaseOpenPending: - rv = DatabaseOpen(); + IDB_TRY(DatabaseOpen(), NS_OK, handleError); break; case State::DatabaseWorkOpen: - rv = DoDatabaseWork(); + IDB_TRY(DoDatabaseWork(), NS_OK, handleError); break; case State::BeginVersionChange: - rv = BeginVersionChange(); + IDB_TRY(BeginVersionChange(), NS_OK, handleError); break; case State::WaitingForTransactionsToComplete: - rv = DispatchToWorkThread(); + IDB_TRY(DispatchToWorkThread(), NS_OK, handleError); break; case State::SendingResults: SendResults(); - return NS_OK; + break; default: MOZ_CRASH("Bad state!"); } - if (NS_WARN_IF(NS_FAILED(rv)) && mState != State::SendingResults) { - SetFailureCodeIfUnset(rv); - - // Must set mState before dispatching otherwise we will race with the owning - // thread. - mState = State::SendingResults; - - if (IsOnOwningThread()) { - SendResults(); - } else { - MOZ_ALWAYS_SUCCEEDS( - mOwningEventTarget->Dispatch(this, NS_DISPATCH_NORMAL)); - } - } - return NS_OK; } void FactoryOp::DirectoryLockAcquired(DirectoryLock* aLock) { AssertIsOnOwningThread(); MOZ_ASSERT(aLock); MOZ_ASSERT(mState == State::DirectoryOpenPending); MOZ_ASSERT(!mDirectoryLock);