From cd831370676d95efe1eb53e76af7b312d6705f50 Mon Sep 17 00:00:00 2001 From: Simon Giesecke Date: Fri, 13 Dec 2019 11:31:56 +0000 Subject: [PATCH] Bug 1600906 - Reduce statefulness of TransactionDatabaseOperationBase using InitializedOnce. r=dom-workers-and-storage-reviewers,ytausky Differential Revision: https://phabricator.services.mozilla.com/D56015 --HG-- extra : moz-landing-system : lando --- dom/indexedDB/ActorsParent.cpp | 235 ++++++++++++++++----------------- 1 file changed, 113 insertions(+), 122 deletions(-) diff --git a/dom/indexedDB/ActorsParent.cpp b/dom/indexedDB/ActorsParent.cpp index bef39a61e9cc..2569ffa09127 100644 --- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -4814,7 +4814,7 @@ class MOZ_STACK_CLASS DatabaseConnection::AutoSavepoint final { AutoSavepoint(); ~AutoSavepoint(); - nsresult Start(const TransactionBase* aTransaction); + nsresult Start(const TransactionBase& aTransaction); nsresult Commit(); }; @@ -5592,7 +5592,7 @@ class TransactionDatabaseOperationBase : public DatabaseOperationBase { Completed }; - RefPtr mTransaction; + InitializedOnce> mTransaction; InternalState mInternalState = InternalState::Initial; bool mWaitingForContinue = false; const bool mTransactionIsAborted; @@ -5627,11 +5627,9 @@ class TransactionDatabaseOperationBase : public DatabaseOperationBase { void DispatchToConnectionPool(); - TransactionBase* Transaction() const { - MOZ_ASSERT(mTransaction); + TransactionBase& Transaction() { return **mTransaction; } - return mTransaction; - } + const TransactionBase& Transaction() const { return **mTransaction; } bool IsWaitingForContinue() const { AssertIsOnOwningThread(); @@ -5656,9 +5654,10 @@ class TransactionDatabaseOperationBase : public DatabaseOperationBase { virtual void Cleanup(); protected: - explicit TransactionDatabaseOperationBase(TransactionBase* aTransaction); + explicit TransactionDatabaseOperationBase( + RefPtr aTransaction); - TransactionDatabaseOperationBase(TransactionBase* aTransaction, + TransactionDatabaseOperationBase(RefPtr aTransaction, uint64_t aLoggingSerialNumber); ~TransactionDatabaseOperationBase() override; @@ -6041,8 +6040,8 @@ class Database::StartTransactionOp final friend class Database; private: - explicit StartTransactionOp(TransactionBase* aTransaction) - : TransactionDatabaseOperationBase(aTransaction, + explicit StartTransactionOp(RefPtr aTransaction) + : TransactionDatabaseOperationBase(std::move(aTransaction), /* aLoggingSerialNumber */ 0) {} ~StartTransactionOp() override = default; @@ -7089,8 +7088,9 @@ class VersionChangeTransactionOp : public TransactionDatabaseOperationBase { void Cleanup() override; protected: - explicit VersionChangeTransactionOp(VersionChangeTransaction* aTransaction) - : TransactionDatabaseOperationBase(aTransaction) {} + explicit VersionChangeTransactionOp( + RefPtr aTransaction) + : TransactionDatabaseOperationBase(std::move(aTransaction)) {} ~VersionChangeTransactionOp() override = default; @@ -7107,9 +7107,10 @@ class CreateObjectStoreOp final : public VersionChangeTransactionOp { private: // Only created by VersionChangeTransaction. - CreateObjectStoreOp(VersionChangeTransaction* aTransaction, + CreateObjectStoreOp(RefPtr aTransaction, const ObjectStoreMetadata& aMetadata) - : VersionChangeTransactionOp(aTransaction), mMetadata(aMetadata) { + : VersionChangeTransactionOp(std::move(aTransaction)), + mMetadata(aMetadata) { MOZ_ASSERT(aMetadata.id()); } @@ -7126,10 +7127,10 @@ class DeleteObjectStoreOp final : public VersionChangeTransactionOp { private: // Only created by VersionChangeTransaction. - DeleteObjectStoreOp(VersionChangeTransaction* aTransaction, + DeleteObjectStoreOp(RefPtr aTransaction, FullObjectStoreMetadata* const aMetadata, const bool aIsLastObjectStore) - : VersionChangeTransactionOp(aTransaction), + : VersionChangeTransactionOp(std::move(aTransaction)), mMetadata(aMetadata), mIsLastObjectStore(aIsLastObjectStore) { MOZ_ASSERT(aMetadata->mCommonMetadata.id()); @@ -7148,9 +7149,9 @@ class RenameObjectStoreOp final : public VersionChangeTransactionOp { private: // Only created by VersionChangeTransaction. - RenameObjectStoreOp(VersionChangeTransaction* aTransaction, + RenameObjectStoreOp(RefPtr aTransaction, FullObjectStoreMetadata* const aMetadata) - : VersionChangeTransactionOp(aTransaction), + : VersionChangeTransactionOp(std::move(aTransaction)), mId(aMetadata->mCommonMetadata.id()), mNewName(aMetadata->mCommonMetadata.name()) { MOZ_ASSERT(mId); @@ -7174,7 +7175,7 @@ class CreateIndexOp final : public VersionChangeTransactionOp { private: // Only created by VersionChangeTransaction. - CreateIndexOp(VersionChangeTransaction* aTransaction, + CreateIndexOp(RefPtr aTransaction, const int64_t aObjectStoreId, const IndexMetadata& aMetadata); ~CreateIndexOp() override = default; @@ -7220,7 +7221,7 @@ class DeleteIndexOp final : public VersionChangeTransactionOp { private: // Only created by VersionChangeTransaction. - DeleteIndexOp(VersionChangeTransaction* aTransaction, + DeleteIndexOp(RefPtr aTransaction, const int64_t aObjectStoreId, const int64_t aIndexId, const bool aUnique, const bool aIsLastIndex); @@ -7242,9 +7243,9 @@ class RenameIndexOp final : public VersionChangeTransactionOp { private: // Only created by VersionChangeTransaction. - RenameIndexOp(VersionChangeTransaction* aTransaction, + RenameIndexOp(RefPtr aTransaction, FullIndexMetadata* const aMetadata, int64_t aObjectStoreId) - : VersionChangeTransactionOp(aTransaction), + : VersionChangeTransactionOp(std::move(aTransaction)), mObjectStoreId(aObjectStoreId), mIndexId(aMetadata->mCommonMetadata.id()), mNewName(aMetadata->mCommonMetadata.name()) { @@ -7266,8 +7267,8 @@ class NormalTransactionOp : public TransactionDatabaseOperationBase, void Cleanup() override; protected: - explicit NormalTransactionOp(TransactionBase* aTransaction) - : TransactionDatabaseOperationBase(aTransaction) + explicit NormalTransactionOp(RefPtr aTransaction) + : TransactionDatabaseOperationBase(std::move(aTransaction)) #ifdef DEBUG , mResponseSent(false) @@ -7332,7 +7333,7 @@ class ObjectStoreAddOrPutRequestOp final : public NormalTransactionOp { private: // Only created by TransactionBase. - ObjectStoreAddOrPutRequestOp(TransactionBase* aTransaction, + ObjectStoreAddOrPutRequestOp(RefPtr aTransaction, const RequestParams& aParams); ~ObjectStoreAddOrPutRequestOp() override = default; @@ -7433,7 +7434,7 @@ class ObjectStoreGetRequestOp final : public NormalTransactionOp { private: // Only created by TransactionBase. - ObjectStoreGetRequestOp(TransactionBase* aTransaction, + ObjectStoreGetRequestOp(RefPtr aTransaction, const RequestParams& aParams, bool aGetAll); ~ObjectStoreGetRequestOp() override = default; @@ -7461,7 +7462,7 @@ class ObjectStoreGetKeyRequestOp final : public NormalTransactionOp { private: // Only created by TransactionBase. - ObjectStoreGetKeyRequestOp(TransactionBase* aTransaction, + ObjectStoreGetKeyRequestOp(RefPtr aTransaction, const RequestParams& aParams, bool aGetAll); ~ObjectStoreGetKeyRequestOp() override = default; @@ -7479,7 +7480,7 @@ class ObjectStoreDeleteRequestOp final : public NormalTransactionOp { bool mObjectStoreMayHaveIndexes; private: - ObjectStoreDeleteRequestOp(TransactionBase* aTransaction, + ObjectStoreDeleteRequestOp(RefPtr aTransaction, const ObjectStoreDeleteParams& aParams); ~ObjectStoreDeleteRequestOp() override = default; @@ -7500,7 +7501,7 @@ class ObjectStoreClearRequestOp final : public NormalTransactionOp { bool mObjectStoreMayHaveIndexes; private: - ObjectStoreClearRequestOp(TransactionBase* aTransaction, + ObjectStoreClearRequestOp(RefPtr aTransaction, const ObjectStoreClearParams& aParams); ~ObjectStoreClearRequestOp() override = default; @@ -7520,9 +7521,9 @@ class ObjectStoreCountRequestOp final : public NormalTransactionOp { ObjectStoreCountResponse mResponse; private: - ObjectStoreCountRequestOp(TransactionBase* aTransaction, + ObjectStoreCountRequestOp(RefPtr aTransaction, const ObjectStoreCountParams& aParams) - : NormalTransactionOp(aTransaction), mParams(aParams) {} + : NormalTransactionOp(std::move(aTransaction)), mParams(aParams) {} ~ObjectStoreCountRequestOp() override = default; @@ -7539,16 +7540,16 @@ class IndexRequestOpBase : public NormalTransactionOp { const RefPtr mMetadata; protected: - IndexRequestOpBase(TransactionBase* aTransaction, + IndexRequestOpBase(RefPtr aTransaction, const RequestParams& aParams) - : NormalTransactionOp(aTransaction), - mMetadata(IndexMetadataForParams(aTransaction, aParams)) {} + : NormalTransactionOp(std::move(aTransaction)), + mMetadata(IndexMetadataForParams(Transaction(), aParams)) {} ~IndexRequestOpBase() override = default; private: static already_AddRefed IndexMetadataForParams( - TransactionBase* aTransaction, const RequestParams& aParams); + const TransactionBase& aTransaction, const RequestParams& aParams); }; class IndexGetRequestOp final : public IndexRequestOpBase { @@ -7563,8 +7564,8 @@ class IndexGetRequestOp final : public IndexRequestOpBase { private: // Only created by TransactionBase. - IndexGetRequestOp(TransactionBase* aTransaction, const RequestParams& aParams, - bool aGetAll); + IndexGetRequestOp(RefPtr aTransaction, + const RequestParams& aParams, bool aGetAll); ~IndexGetRequestOp() override = default; @@ -7583,7 +7584,7 @@ class IndexGetKeyRequestOp final : public IndexRequestOpBase { private: // Only created by TransactionBase. - IndexGetKeyRequestOp(TransactionBase* aTransaction, + IndexGetKeyRequestOp(RefPtr aTransaction, const RequestParams& aParams, bool aGetAll); ~IndexGetKeyRequestOp() override = default; @@ -7601,9 +7602,9 @@ class IndexCountRequestOp final : public IndexRequestOpBase { private: // Only created by TransactionBase. - IndexCountRequestOp(TransactionBase* aTransaction, + IndexCountRequestOp(RefPtr aTransaction, const RequestParams& aParams) - : IndexRequestOpBase(aTransaction, aParams), + : IndexRequestOpBase(std::move(aTransaction), aParams), mParams(aParams.get_IndexCountParams()) {} ~IndexCountRequestOp() override = default; @@ -10558,14 +10559,13 @@ DatabaseConnection::AutoSavepoint::~AutoSavepoint() { } nsresult DatabaseConnection::AutoSavepoint::Start( - const TransactionBase* aTransaction) { - MOZ_ASSERT(aTransaction); - MOZ_ASSERT(aTransaction->GetMode() == IDBTransaction::Mode::ReadWrite || - aTransaction->GetMode() == IDBTransaction::Mode::ReadWriteFlush || - aTransaction->GetMode() == IDBTransaction::Mode::Cleanup || - aTransaction->GetMode() == IDBTransaction::Mode::VersionChange); + const TransactionBase& aTransaction) { + MOZ_ASSERT(aTransaction.GetMode() == IDBTransaction::Mode::ReadWrite || + aTransaction.GetMode() == IDBTransaction::Mode::ReadWriteFlush || + aTransaction.GetMode() == IDBTransaction::Mode::Cleanup || + aTransaction.GetMode() == IDBTransaction::Mode::VersionChange); - DatabaseConnection* connection = aTransaction->GetDatabase()->GetConnection(); + DatabaseConnection* connection = aTransaction.GetDatabase()->GetConnection(); MOZ_ASSERT(connection); connection->AssertIsOnConnectionThread(); @@ -10589,7 +10589,7 @@ nsresult DatabaseConnection::AutoSavepoint::Start( mConnection = connection; #ifdef DEBUG - mDEBUGTransaction = aTransaction; + mDEBUGTransaction = &aTransaction; #endif return NS_OK; @@ -13636,7 +13636,6 @@ mozilla::ipc::IPCResult Database::RecvClose() { void Database::StartTransactionOp::RunOnConnectionThread() { MOZ_ASSERT(!IsOnBackgroundThread()); - MOZ_ASSERT(Transaction()); MOZ_ASSERT(!HasFailed()); IDB_LOG_MARK_PARENT_TRANSACTION("Beginning database work", "DB Start", @@ -13651,16 +13650,16 @@ nsresult Database::StartTransactionOp::DoDatabaseWork( MOZ_ASSERT(aConnection); aConnection->AssertIsOnConnectionThread(); - Transaction()->SetActiveOnConnectionThread(); + Transaction().SetActiveOnConnectionThread(); - if (Transaction()->GetMode() == IDBTransaction::Mode::Cleanup) { + if (Transaction().GetMode() == IDBTransaction::Mode::Cleanup) { nsresult rv = aConnection->DisableQuotaChecks(); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } - if (Transaction()->GetMode() != IDBTransaction::Mode::ReadOnly) { + if (Transaction().GetMode() != IDBTransaction::Mode::ReadOnly) { nsresult rv = aConnection->BeginWriteTransaction(); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; @@ -21607,7 +21606,7 @@ nsresult OpenDatabaseOp::VersionChangeOp::DoDatabaseWork( IDB_LOG_ID_STRING(mBackgroundChildLoggingId), mTransactionLoggingSerialNumber); - Transaction()->SetActiveOnConnectionThread(); + Transaction().SetActiveOnConnectionThread(); nsresult rv = aConnection->BeginWriteTransaction(); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -22122,25 +22121,22 @@ nsresult DeleteDatabaseOp::VersionChangeOp::Run() { } TransactionDatabaseOperationBase::TransactionDatabaseOperationBase( - TransactionBase* aTransaction) + RefPtr aTransaction) : DatabaseOperationBase(aTransaction->GetLoggingInfo()->Id(), aTransaction->GetLoggingInfo()->NextRequestSN()), - mTransaction(aTransaction), - mTransactionIsAborted(aTransaction->IsAborted()), - mTransactionLoggingSerialNumber(aTransaction->LoggingSerialNumber()) { - MOZ_ASSERT(aTransaction); + mTransaction(aTransaction.forget()), + mTransactionIsAborted((*mTransaction)->IsAborted()), + mTransactionLoggingSerialNumber((*mTransaction)->LoggingSerialNumber()) { MOZ_ASSERT(LoggingSerialNumber()); } TransactionDatabaseOperationBase::TransactionDatabaseOperationBase( - TransactionBase* aTransaction, uint64_t aLoggingSerialNumber) + RefPtr aTransaction, uint64_t aLoggingSerialNumber) : DatabaseOperationBase(aTransaction->GetLoggingInfo()->Id(), aLoggingSerialNumber), - mTransaction(aTransaction), - mTransactionIsAborted(aTransaction->IsAborted()), - mTransactionLoggingSerialNumber(aTransaction->LoggingSerialNumber()) { - MOZ_ASSERT(aTransaction); -} + mTransaction(aTransaction.forget()), + mTransactionIsAborted((*mTransaction)->IsAborted()), + mTransactionLoggingSerialNumber((*mTransaction)->LoggingSerialNumber()) {} TransactionDatabaseOperationBase::~TransactionDatabaseOperationBase() { MOZ_ASSERT(mInternalState == InternalState::Completed); @@ -22152,8 +22148,7 @@ TransactionDatabaseOperationBase::~TransactionDatabaseOperationBase() { #ifdef DEBUG void TransactionDatabaseOperationBase::AssertIsOnConnectionThread() const { - MOZ_ASSERT(mTransaction); - mTransaction->AssertIsOnConnectionThread(); + (*mTransaction)->AssertIsOnConnectionThread(); } #endif // DEBUG @@ -22184,7 +22179,6 @@ void TransactionDatabaseOperationBase::DispatchToConnectionPool() { void TransactionDatabaseOperationBase::RunOnConnectionThread() { MOZ_ASSERT(!IsOnBackgroundThread()); MOZ_ASSERT(mInternalState == InternalState::DatabaseWork); - MOZ_ASSERT(mTransaction); MOZ_ASSERT(!HasFailed()); AUTO_PROFILER_LABEL("TransactionDatabaseOperationBase::RunOnConnectionThread", @@ -22192,7 +22186,7 @@ void TransactionDatabaseOperationBase::RunOnConnectionThread() { // There are several cases where we don't actually have to to any work here. - if (mTransactionIsAborted || mTransaction->IsInvalidatedOnAnyThread()) { + if (mTransactionIsAborted || (*mTransaction)->IsInvalidatedOnAnyThread()) { // This transaction is already set to be aborted or invalidated. SetFailureCode(NS_ERROR_DOM_INDEXEDDB_ABORT_ERR); } else if (!OperationMayProceed()) { @@ -22201,7 +22195,7 @@ void TransactionDatabaseOperationBase::RunOnConnectionThread() { IDB_REPORT_INTERNAL_ERR(); OverrideFailureCode(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); } else { - Database* database = mTransaction->GetDatabase(); + Database* database = (*mTransaction)->GetDatabase(); MOZ_ASSERT(database); // Here we're actually going to perform the database operation. @@ -22286,9 +22280,9 @@ void TransactionDatabaseOperationBase::SendToConnectionPool() { // connection thread. mInternalState = InternalState::DatabaseWork; - gConnectionPool->Dispatch(mTransaction->TransactionId(), this); + gConnectionPool->Dispatch((*mTransaction)->TransactionId(), this); - mTransaction->NoteActiveRequest(); + (*mTransaction)->NoteActiveRequest(); } void TransactionDatabaseOperationBase::SendPreprocess() { @@ -22310,14 +22304,13 @@ void TransactionDatabaseOperationBase::SendPreprocessInfoOrResults( AssertIsOnOwningThread(); MOZ_ASSERT(mInternalState == InternalState::SendingPreprocess || mInternalState == InternalState::SendingResults); - MOZ_ASSERT(mTransaction); // The flag is raised only when there is no mUpdateRefcountFunction for the // executing operation. It assume that is because the previous // StartTransactionOp was failed to begin a write transaction and it reported // when this operation has already jumped to the Connection thread. MOZ_DIAGNOSTIC_ASSERT_IF(mAssumingPreviousOperationFail, - mTransaction->IsAborted()); + (*mTransaction)->IsAborted()); if (NS_WARN_IF(IsActorDestroyed())) { // Normally we wouldn't need to send any notifications if the actor was @@ -22331,7 +22324,7 @@ void TransactionDatabaseOperationBase::SendPreprocessInfoOrResults( IDB_REPORT_INTERNAL_ERR(); SetFailureCode(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); } - } else if (mTransaction->IsInvalidated() || mTransaction->IsAborted()) { + } else if ((*mTransaction)->IsInvalidated() || (*mTransaction)->IsAborted()) { // Aborted transactions always see their requests fail with ABORT_ERR, // even if the request succeeded or failed with another error. OverrideFailureCode(NS_ERROR_DOM_INDEXEDDB_ABORT_ERR); @@ -22355,7 +22348,7 @@ void TransactionDatabaseOperationBase::SendPreprocessInfoOrResults( // This should definitely release the IPDL reference. if (!SendFailureResult(rv)) { // Abort the transaction. - mTransaction->Abort(rv, /* aForce */ false); + (*mTransaction)->Abort(rv, /* aForce */ false); } } @@ -22365,7 +22358,7 @@ void TransactionDatabaseOperationBase::SendPreprocessInfoOrResults( mWaitingForContinue = true; } else { if (mLoggingSerialNumber) { - mTransaction->NoteFinishedRequest(); + (*mTransaction)->NoteFinishedRequest(); } Cleanup(); @@ -22385,9 +22378,8 @@ bool TransactionDatabaseOperationBase::Init(TransactionBase* aTransaction) { void TransactionDatabaseOperationBase::Cleanup() { AssertIsOnOwningThread(); MOZ_ASSERT(mInternalState == InternalState::SendingResults); - MOZ_ASSERT(mTransaction); - mTransaction = nullptr; + mTransaction.reset(); } NS_IMETHODIMP @@ -23173,7 +23165,7 @@ nsresult DeleteObjectStoreOp::DoDatabaseWork(DatabaseConnection* aConnection) { } if (mMetadata->mCommonMetadata.autoIncrement()) { - Transaction()->ForgetModifiedAutoIncrementObjectStore(mMetadata); + Transaction().ForgetModifiedAutoIncrementObjectStore(mMetadata); } return NS_OK; @@ -23251,13 +23243,13 @@ nsresult RenameObjectStoreOp::DoDatabaseWork(DatabaseConnection* aConnection) { return NS_OK; } -CreateIndexOp::CreateIndexOp(VersionChangeTransaction* aTransaction, +CreateIndexOp::CreateIndexOp(RefPtr aTransaction, const int64_t aObjectStoreId, const IndexMetadata& aMetadata) - : VersionChangeTransactionOp(aTransaction), + : VersionChangeTransactionOp(std::move(aTransaction)), mMetadata(aMetadata), - mFileManager(aTransaction->GetDatabase()->GetFileManager()), - mDatabaseId(aTransaction->DatabaseId()), + mFileManager(Transaction().GetDatabase()->GetFileManager()), + mDatabaseId(Transaction().DatabaseId()), mObjectStoreId(aObjectStoreId) { MOZ_ASSERT(aObjectStoreId); MOZ_ASSERT(aMetadata.id()); @@ -23651,11 +23643,11 @@ CreateIndexOp::UpdateIndexDataValuesFunction::OnFunctionCall( return NS_OK; } -DeleteIndexOp::DeleteIndexOp(VersionChangeTransaction* aTransaction, +DeleteIndexOp::DeleteIndexOp(RefPtr aTransaction, const int64_t aObjectStoreId, const int64_t aIndexId, const bool aUnique, const bool aIsLastIndex) - : VersionChangeTransactionOp(aTransaction), + : VersionChangeTransactionOp(std::move(aTransaction)), mObjectStoreId(aObjectStoreId), mIndexId(aIndexId), mUnique(aUnique), @@ -24165,7 +24157,7 @@ nsresult NormalTransactionOp::ObjectStoreHasIndexes( MOZ_ASSERT(aHasIndexes); bool hasIndexes; - if (aOp->Transaction()->GetMode() == IDBTransaction::Mode::VersionChange && + if (aOp->Transaction().GetMode() == IDBTransaction::Mode::VersionChange && aMayHaveIndexes) { // If this is a version change transaction then mObjectStoreMayHaveIndexes // could be wrong (e.g. if a unique index failed to be created due to a @@ -24331,21 +24323,21 @@ mozilla::ipc::IPCResult NormalTransactionOp::RecvContinue( } ObjectStoreAddOrPutRequestOp::ObjectStoreAddOrPutRequestOp( - TransactionBase* aTransaction, const RequestParams& aParams) - : NormalTransactionOp(aTransaction), + RefPtr aTransaction, const RequestParams& aParams) + : NormalTransactionOp(std::move(aTransaction)), mParams(aParams.type() == RequestParams::TObjectStoreAddParams ? aParams.get_ObjectStoreAddParams().commonParams() : aParams.get_ObjectStorePutParams().commonParams()), - mGroup(aTransaction->GetDatabase()->Group()), - mOrigin(aTransaction->GetDatabase()->Origin()), - mPersistenceType(aTransaction->GetDatabase()->Type()), + mGroup(Transaction().GetDatabase()->Group()), + mOrigin(Transaction().GetDatabase()->Origin()), + mPersistenceType(Transaction().GetDatabase()->Type()), mOverwrite(aParams.type() == RequestParams::TObjectStorePutParams), mObjectStoreMayHaveIndexes(false) { MOZ_ASSERT(aParams.type() == RequestParams::TObjectStoreAddParams || aParams.type() == RequestParams::TObjectStorePutParams); mMetadata = - aTransaction->GetMetadataForObjectStoreId(mParams.objectStoreId()); + Transaction().GetMetadataForObjectStoreId(mParams.objectStoreId()); MOZ_ASSERT(mMetadata); mObjectStoreMayHaveIndexes = mMetadata->HasLiveIndexes(); @@ -24737,7 +24729,7 @@ nsresult ObjectStoreAddOrPutRequestOp::DoDatabaseWork( if (inputStream) { if (fileHelper.isNothing()) { RefPtr fileManager = - Transaction()->GetDatabase()->GetFileManager(); + Transaction().GetDatabase()->GetFileManager(); MOZ_ASSERT(fileManager); fileHelper.emplace(fileManager); @@ -24843,7 +24835,7 @@ nsresult ObjectStoreAddOrPutRequestOp::DoDatabaseWork( if (autoIncrementNum) { mMetadata->mNextAutoIncrementId = autoIncrementNum + 1; - Transaction()->NoteModifiedAutoIncrementObjectStore(mMetadata); + Transaction().NoteModifiedAutoIncrementObjectStore(mMetadata); } return NS_OK; @@ -24928,18 +24920,18 @@ ObjectStoreAddOrPutRequestOp::SCInputStream::IsNonBlocking(bool* _retval) { return NS_OK; } -ObjectStoreGetRequestOp::ObjectStoreGetRequestOp(TransactionBase* aTransaction, - const RequestParams& aParams, - bool aGetAll) - : NormalTransactionOp(aTransaction), +ObjectStoreGetRequestOp::ObjectStoreGetRequestOp( + RefPtr aTransaction, const RequestParams& aParams, + bool aGetAll) + : NormalTransactionOp(std::move(aTransaction)), mObjectStoreId(aGetAll ? aParams.get_ObjectStoreGetAllParams().objectStoreId() : aParams.get_ObjectStoreGetParams().objectStoreId()), - mDatabase(aTransaction->GetDatabase()), + mDatabase(Transaction().GetDatabase()), mOptionalKeyRange( aGetAll ? aParams.get_ObjectStoreGetAllParams().optionalKeyRange() : Some(aParams.get_ObjectStoreGetParams().keyRange())), - mBackgroundParent(aTransaction->GetBackgroundParent()), + mBackgroundParent(Transaction().GetBackgroundParent()), mPreprocessInfoCount(0), mLimit(aGetAll ? aParams.get_ObjectStoreGetAllParams().limit() : 1), mGetAll(aGetAll) { @@ -25156,8 +25148,9 @@ void ObjectStoreGetRequestOp::GetResponse(RequestResponse& aResponse, } ObjectStoreGetKeyRequestOp::ObjectStoreGetKeyRequestOp( - TransactionBase* aTransaction, const RequestParams& aParams, bool aGetAll) - : NormalTransactionOp(aTransaction), + RefPtr aTransaction, const RequestParams& aParams, + bool aGetAll) + : NormalTransactionOp(std::move(aTransaction)), mObjectStoreId( aGetAll ? aParams.get_ObjectStoreGetAllKeysParams().objectStoreId() : aParams.get_ObjectStoreGetKeyParams().objectStoreId()), @@ -25262,15 +25255,15 @@ void ObjectStoreGetKeyRequestOp::GetResponse(RequestResponse& aResponse, } ObjectStoreDeleteRequestOp::ObjectStoreDeleteRequestOp( - TransactionBase* aTransaction, const ObjectStoreDeleteParams& aParams) - : NormalTransactionOp(aTransaction), + RefPtr aTransaction, + const ObjectStoreDeleteParams& aParams) + : NormalTransactionOp(std::move(aTransaction)), mParams(aParams), mObjectStoreMayHaveIndexes(false) { AssertIsOnBackgroundThread(); - MOZ_ASSERT(aTransaction); RefPtr metadata = - aTransaction->GetMetadataForObjectStoreId(mParams.objectStoreId()); + Transaction().GetMetadataForObjectStoreId(mParams.objectStoreId()); MOZ_ASSERT(metadata); mObjectStoreMayHaveIndexes = metadata->HasLiveIndexes(); @@ -25344,15 +25337,14 @@ nsresult ObjectStoreDeleteRequestOp::DoDatabaseWork( } ObjectStoreClearRequestOp::ObjectStoreClearRequestOp( - TransactionBase* aTransaction, const ObjectStoreClearParams& aParams) - : NormalTransactionOp(aTransaction), + RefPtr aTransaction, const ObjectStoreClearParams& aParams) + : NormalTransactionOp(std::move(aTransaction)), mParams(aParams), mObjectStoreMayHaveIndexes(false) { AssertIsOnBackgroundThread(); - MOZ_ASSERT(aTransaction); RefPtr metadata = - aTransaction->GetMetadataForObjectStoreId(mParams.objectStoreId()); + Transaction().GetMetadataForObjectStoreId(mParams.objectStoreId()); MOZ_ASSERT(metadata); mObjectStoreMayHaveIndexes = metadata->HasLiveIndexes(); @@ -25475,9 +25467,8 @@ nsresult ObjectStoreCountRequestOp::DoDatabaseWork( // static already_AddRefed IndexRequestOpBase::IndexMetadataForParams( - TransactionBase* aTransaction, const RequestParams& aParams) { + const TransactionBase& aTransaction, const RequestParams& aParams) { AssertIsOnBackgroundThread(); - MOZ_ASSERT(aTransaction); MOZ_ASSERT(aParams.type() == RequestParams::TIndexGetParams || aParams.type() == RequestParams::TIndexGetKeyParams || aParams.type() == RequestParams::TIndexGetAllParams || @@ -25528,24 +25519,24 @@ already_AddRefed IndexRequestOpBase::IndexMetadataForParams( } const RefPtr objectStoreMetadata = - aTransaction->GetMetadataForObjectStoreId(objectStoreId); + aTransaction.GetMetadataForObjectStoreId(objectStoreId); MOZ_ASSERT(objectStoreMetadata); RefPtr indexMetadata = - aTransaction->GetMetadataForIndexId(objectStoreMetadata, indexId); + aTransaction.GetMetadataForIndexId(objectStoreMetadata, indexId); MOZ_ASSERT(indexMetadata); return indexMetadata.forget(); } -IndexGetRequestOp::IndexGetRequestOp(TransactionBase* aTransaction, +IndexGetRequestOp::IndexGetRequestOp(RefPtr aTransaction, const RequestParams& aParams, bool aGetAll) - : IndexRequestOpBase(aTransaction, aParams), - mDatabase(aTransaction->GetDatabase()), + : IndexRequestOpBase(std::move(aTransaction), aParams), + mDatabase(Transaction().GetDatabase()), mOptionalKeyRange(aGetAll ? aParams.get_IndexGetAllParams().optionalKeyRange() : Some(aParams.get_IndexGetParams().keyRange())), - mBackgroundParent(aTransaction->GetBackgroundParent()), + mBackgroundParent(Transaction().GetBackgroundParent()), mLimit(aGetAll ? aParams.get_IndexGetAllParams().limit() : 1), mGetAll(aGetAll) { MOZ_ASSERT(aParams.type() == RequestParams::TIndexGetParams || @@ -25716,10 +25707,10 @@ void IndexGetRequestOp::GetResponse(RequestResponse& aResponse, } } -IndexGetKeyRequestOp::IndexGetKeyRequestOp(TransactionBase* aTransaction, +IndexGetKeyRequestOp::IndexGetKeyRequestOp(RefPtr aTransaction, const RequestParams& aParams, bool aGetAll) - : IndexRequestOpBase(aTransaction, aParams), + : IndexRequestOpBase(std::move(aTransaction), aParams), mOptionalKeyRange( aGetAll ? aParams.get_IndexGetAllKeysParams().optionalKeyRange() : Some(aParams.get_IndexGetKeyParams().keyRange())), @@ -25913,7 +25904,7 @@ bool Cursor::CursorOpBase::SendFailureResult(nsresult aResultCode) { // preloading they have become more frequent (also during startup). One // possible cause with cursor preloading is to be addressed by Bug 1597191. NS_WARNING_ASSERTION( - !mFiles.IsEmpty() && !Transaction()->IsInvalidated(), + !mFiles.IsEmpty() && !Transaction().IsInvalidated(), "Expected empty mFiles when transaction has not been invalidated"); // SendResponseInternal will assert when mResponse.type() is @@ -26003,7 +25994,7 @@ Cursor::CursorOpBase::ResponseSizeOrError Cursor::CursorOpBase::PopulateResponseFromStatement( mozIStorageStatement* const aStmt, const bool aInitializeResponse, Key* const aOptOutSortKey) { - Transaction()->AssertIsOnConnectionThread(); + Transaction().AssertIsOnConnectionThread(); MOZ_ASSERT_IF(aInitializeResponse, mResponse.type() == CursorResponse::T__None); MOZ_ASSERT_IF(!aInitializeResponse,