From 9ca513777ab18d01fd69a74e30c0f69d5e97adfa Mon Sep 17 00:00:00 2001 From: alwu Date: Mon, 3 Feb 2025 18:22:27 +0000 Subject: [PATCH] Bug 1922889 - add mutex. r=media-playback-reviewers,aosmond, a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D226398 --- dom/media/ipc/MFCDMChild.cpp | 27 ++++++++++++++++++++------- dom/media/ipc/MFCDMChild.h | 6 ++++-- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/dom/media/ipc/MFCDMChild.cpp b/dom/media/ipc/MFCDMChild.cpp index 4cbc74039704..feb61c82afae 100644 --- a/dom/media/ipc/MFCDMChild.cpp +++ b/dom/media/ipc/MFCDMChild.cpp @@ -24,6 +24,7 @@ namespace mozilla { self->mManagerThread, callsite, \ [self, promiseId, callsite]( \ PMFCDMChild::method##Promise::ResolveOrRejectValue&& result) { \ + MutexAutoLock lock(self->mMutex); \ auto iter = self->mPendingGenericPromises.find(promiseId); \ if (iter == self->mPendingGenericPromises.end()) { \ return; \ @@ -135,15 +136,18 @@ void MFCDMChild::Shutdown() { mRemoteRequest.DisconnectIfExists(); mInitRequest.DisconnectIfExists(); - for (auto& promise : mPendingSessionPromises) { - promise.second.RejectIfExists(NS_ERROR_ABORT, __func__); - } - mPendingSessionPromises.clear(); + { + MutexAutoLock lock(mMutex); + for (auto& promise : mPendingSessionPromises) { + promise.second.RejectIfExists(NS_ERROR_ABORT, __func__); + } + mPendingSessionPromises.clear(); - for (auto& promise : mPendingGenericPromises) { - promise.second.RejectIfExists(NS_ERROR_ABORT, __func__); + for (auto& promise : mPendingGenericPromises) { + promise.second.RejectIfExists(NS_ERROR_ABORT, __func__); + } + mPendingGenericPromises.clear(); } - mPendingGenericPromises.clear(); mRemotePromiseHolder.RejectIfExists(NS_ERROR_ABORT, __func__); mCapabilitiesPromiseHolder.RejectIfExists(NS_ERROR_ABORT, __func__); @@ -274,6 +278,7 @@ RefPtr MFCDMChild::CreateSessionAndGenerateRequest( __func__); } + MutexAutoLock lock(mMutex); MOZ_ASSERT(mPendingSessionPromises.find(aPromiseId) == mPendingSessionPromises.end()); mPendingSessionPromises.emplace(aPromiseId, @@ -287,6 +292,7 @@ RefPtr MFCDMChild::CreateSessionAndGenerateRequest( SendCreateSessionAndGenerateRequest(params)->Then( mManagerThread, __func__, [self, aPromiseId, this](const MFCDMSessionResult& result) { + MutexAutoLock lock(mMutex); auto iter = mPendingSessionPromises.find(aPromiseId); if (iter == mPendingSessionPromises.end()) { return; @@ -303,6 +309,7 @@ RefPtr MFCDMChild::CreateSessionAndGenerateRequest( }, [self, aPromiseId, this](const mozilla::ipc::ResponseRejectReason& aReason) { + MutexAutoLock lock(mMutex); auto iter = mPendingSessionPromises.find(aPromiseId); if (iter == mPendingSessionPromises.end()) { return; @@ -325,6 +332,7 @@ RefPtr MFCDMChild::LoadSession( return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); } + MutexAutoLock lock(mMutex); MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == mPendingGenericPromises.end()); mPendingGenericPromises.emplace(aPromiseId, @@ -343,6 +351,7 @@ RefPtr MFCDMChild::UpdateSession(uint32_t aPromiseId, return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); } + MutexAutoLock lock(mMutex); MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == mPendingGenericPromises.end()); mPendingGenericPromises.emplace(aPromiseId, @@ -361,6 +370,7 @@ RefPtr MFCDMChild::CloseSession(uint32_t aPromiseId, return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); } + MutexAutoLock lock(mMutex); MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == mPendingGenericPromises.end()); mPendingGenericPromises.emplace(aPromiseId, @@ -378,6 +388,7 @@ RefPtr MFCDMChild::RemoveSession(uint32_t aPromiseId, return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); } + MutexAutoLock lock(mMutex); MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == mPendingGenericPromises.end()); mPendingGenericPromises.emplace(aPromiseId, @@ -395,6 +406,7 @@ RefPtr MFCDMChild::SetServerCertificate( return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); } + MutexAutoLock lock(mMutex); MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == mPendingGenericPromises.end()); mPendingGenericPromises.emplace(aPromiseId, @@ -412,6 +424,7 @@ RefPtr MFCDMChild::GetStatusForPolicy( return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); } + MutexAutoLock lock(mMutex); MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == mPendingGenericPromises.end()); mPendingGenericPromises.emplace(aPromiseId, diff --git a/dom/media/ipc/MFCDMChild.h b/dom/media/ipc/MFCDMChild.h index 2f36b9df0d18..fa83dc35a26b 100644 --- a/dom/media/ipc/MFCDMChild.h +++ b/dom/media/ipc/MFCDMChild.h @@ -141,11 +141,13 @@ class MFCDMChild final : public PMFCDMChild { MozPromiseHolder mRemoveSessionPromiseHolder; MozPromiseRequestHolder mRemoveSessionRequest; + mutable Mutex mMutex{"MFCDMChild"}; + std::unordered_map> - mPendingSessionPromises; + mPendingSessionPromises MOZ_GUARDED_BY(mMutex); std::unordered_map> - mPendingGenericPromises; + mPendingGenericPromises MOZ_GUARDED_BY(mMutex); RefPtr mProxyCallback; };