Bug 1922889 - add mutex. r=media-playback-reviewers,aosmond, a=dmeehan

Differential Revision: https://phabricator.services.mozilla.com/D226398
This commit is contained in:
alwu 2025-02-03 18:22:27 +00:00
parent 836cb2bb61
commit 9ca513777a
2 changed files with 24 additions and 9 deletions

View file

@ -24,6 +24,7 @@ namespace mozilla {
self->mManagerThread, callsite, \ self->mManagerThread, callsite, \
[self, promiseId, callsite]( \ [self, promiseId, callsite]( \
PMFCDMChild::method##Promise::ResolveOrRejectValue&& result) { \ PMFCDMChild::method##Promise::ResolveOrRejectValue&& result) { \
MutexAutoLock lock(self->mMutex); \
auto iter = self->mPendingGenericPromises.find(promiseId); \ auto iter = self->mPendingGenericPromises.find(promiseId); \
if (iter == self->mPendingGenericPromises.end()) { \ if (iter == self->mPendingGenericPromises.end()) { \
return; \ return; \
@ -135,6 +136,8 @@ void MFCDMChild::Shutdown() {
mRemoteRequest.DisconnectIfExists(); mRemoteRequest.DisconnectIfExists();
mInitRequest.DisconnectIfExists(); mInitRequest.DisconnectIfExists();
{
MutexAutoLock lock(mMutex);
for (auto& promise : mPendingSessionPromises) { for (auto& promise : mPendingSessionPromises) {
promise.second.RejectIfExists(NS_ERROR_ABORT, __func__); promise.second.RejectIfExists(NS_ERROR_ABORT, __func__);
} }
@ -144,6 +147,7 @@ void MFCDMChild::Shutdown() {
promise.second.RejectIfExists(NS_ERROR_ABORT, __func__); promise.second.RejectIfExists(NS_ERROR_ABORT, __func__);
} }
mPendingGenericPromises.clear(); mPendingGenericPromises.clear();
}
mRemotePromiseHolder.RejectIfExists(NS_ERROR_ABORT, __func__); mRemotePromiseHolder.RejectIfExists(NS_ERROR_ABORT, __func__);
mCapabilitiesPromiseHolder.RejectIfExists(NS_ERROR_ABORT, __func__); mCapabilitiesPromiseHolder.RejectIfExists(NS_ERROR_ABORT, __func__);
@ -274,6 +278,7 @@ RefPtr<MFCDMChild::SessionPromise> MFCDMChild::CreateSessionAndGenerateRequest(
__func__); __func__);
} }
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mPendingSessionPromises.find(aPromiseId) == MOZ_ASSERT(mPendingSessionPromises.find(aPromiseId) ==
mPendingSessionPromises.end()); mPendingSessionPromises.end());
mPendingSessionPromises.emplace(aPromiseId, mPendingSessionPromises.emplace(aPromiseId,
@ -287,6 +292,7 @@ RefPtr<MFCDMChild::SessionPromise> MFCDMChild::CreateSessionAndGenerateRequest(
SendCreateSessionAndGenerateRequest(params)->Then( SendCreateSessionAndGenerateRequest(params)->Then(
mManagerThread, __func__, mManagerThread, __func__,
[self, aPromiseId, this](const MFCDMSessionResult& result) { [self, aPromiseId, this](const MFCDMSessionResult& result) {
MutexAutoLock lock(mMutex);
auto iter = mPendingSessionPromises.find(aPromiseId); auto iter = mPendingSessionPromises.find(aPromiseId);
if (iter == mPendingSessionPromises.end()) { if (iter == mPendingSessionPromises.end()) {
return; return;
@ -303,6 +309,7 @@ RefPtr<MFCDMChild::SessionPromise> MFCDMChild::CreateSessionAndGenerateRequest(
}, },
[self, aPromiseId, [self, aPromiseId,
this](const mozilla::ipc::ResponseRejectReason& aReason) { this](const mozilla::ipc::ResponseRejectReason& aReason) {
MutexAutoLock lock(mMutex);
auto iter = mPendingSessionPromises.find(aPromiseId); auto iter = mPendingSessionPromises.find(aPromiseId);
if (iter == mPendingSessionPromises.end()) { if (iter == mPendingSessionPromises.end()) {
return; return;
@ -325,6 +332,7 @@ RefPtr<GenericPromise> MFCDMChild::LoadSession(
return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__);
} }
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) ==
mPendingGenericPromises.end()); mPendingGenericPromises.end());
mPendingGenericPromises.emplace(aPromiseId, mPendingGenericPromises.emplace(aPromiseId,
@ -343,6 +351,7 @@ RefPtr<GenericPromise> MFCDMChild::UpdateSession(uint32_t aPromiseId,
return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__);
} }
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) ==
mPendingGenericPromises.end()); mPendingGenericPromises.end());
mPendingGenericPromises.emplace(aPromiseId, mPendingGenericPromises.emplace(aPromiseId,
@ -361,6 +370,7 @@ RefPtr<GenericPromise> MFCDMChild::CloseSession(uint32_t aPromiseId,
return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__);
} }
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) ==
mPendingGenericPromises.end()); mPendingGenericPromises.end());
mPendingGenericPromises.emplace(aPromiseId, mPendingGenericPromises.emplace(aPromiseId,
@ -378,6 +388,7 @@ RefPtr<GenericPromise> MFCDMChild::RemoveSession(uint32_t aPromiseId,
return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__);
} }
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) ==
mPendingGenericPromises.end()); mPendingGenericPromises.end());
mPendingGenericPromises.emplace(aPromiseId, mPendingGenericPromises.emplace(aPromiseId,
@ -395,6 +406,7 @@ RefPtr<GenericPromise> MFCDMChild::SetServerCertificate(
return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__);
} }
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) ==
mPendingGenericPromises.end()); mPendingGenericPromises.end());
mPendingGenericPromises.emplace(aPromiseId, mPendingGenericPromises.emplace(aPromiseId,
@ -412,6 +424,7 @@ RefPtr<GenericPromise> MFCDMChild::GetStatusForPolicy(
return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__); return GenericPromise::CreateAndReject(NS_ERROR_ABORT, __func__);
} }
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) == MOZ_ASSERT(mPendingGenericPromises.find(aPromiseId) ==
mPendingGenericPromises.end()); mPendingGenericPromises.end());
mPendingGenericPromises.emplace(aPromiseId, mPendingGenericPromises.emplace(aPromiseId,

View file

@ -141,11 +141,13 @@ class MFCDMChild final : public PMFCDMChild {
MozPromiseHolder<GenericPromise> mRemoveSessionPromiseHolder; MozPromiseHolder<GenericPromise> mRemoveSessionPromiseHolder;
MozPromiseRequestHolder<RemoveSessionPromise> mRemoveSessionRequest; MozPromiseRequestHolder<RemoveSessionPromise> mRemoveSessionRequest;
mutable Mutex mMutex{"MFCDMChild"};
std::unordered_map<uint32_t, MozPromiseHolder<SessionPromise>> std::unordered_map<uint32_t, MozPromiseHolder<SessionPromise>>
mPendingSessionPromises; mPendingSessionPromises MOZ_GUARDED_BY(mMutex);
std::unordered_map<uint32_t, MozPromiseHolder<GenericPromise>> std::unordered_map<uint32_t, MozPromiseHolder<GenericPromise>>
mPendingGenericPromises; mPendingGenericPromises MOZ_GUARDED_BY(mMutex);
RefPtr<WMFCDMProxyCallback> mProxyCallback; RefPtr<WMFCDMProxyCallback> mProxyCallback;
}; };