Bug 1813491 - Simplify promises and stats shuffling in MediaTransportHandler::GetIceStats. r=bwc

Differential Revision: https://phabricator.services.mozilla.com/D168731
This commit is contained in:
Andreas Pehrson 2023-02-09 15:33:03 +00:00
parent 973e7bf4aa
commit 3881bedee2
5 changed files with 39 additions and 105 deletions

View File

@ -14,7 +14,7 @@ using mozilla::StringVector from "mozilla/media/webrtc/WebrtcIPCTraits.h";
using mozilla::CandidateInfo from "mozilla/media/webrtc/WebrtcIPCTraits.h";
using mozilla::DtlsDigestList from "mozilla/media/webrtc/WebrtcIPCTraits.h";
using std::string from "string";
using struct mozilla::dom::NotReallyMovableButLetsPretendItIsRTCStatsCollection from "mozilla/dom/RTCStatsReportBinding.h";
using struct mozilla::dom::RTCStatsCollection from "mozilla/dom/RTCStatsReportBinding.h";
using WebrtcGlobalLog from "mozilla/media/webrtc/WebrtcGlobal.h";
using mozilla::dom::RTCIceServer from "mozilla/dom/RTCConfigurationBinding.h";
using mozilla::dom::RTCIceTransportPolicy from "mozilla/dom/RTCConfigurationBinding.h";
@ -87,7 +87,7 @@ parent:
async UpdateNetworkState(bool online);
async GetIceStats(string transportId, double now) returns (NotReallyMovableButLetsPretendItIsRTCStatsCollection stats);
async GetIceStats(string transportId, double now) returns (UniquePtr<RTCStatsCollection> stats);
child:
async OnCandidate(string transportId, CandidateInfo candidateInfo);

View File

@ -19,22 +19,6 @@ typedef mozilla::dom::Sequence<nsString> WebrtcGlobalLog;
namespace mozilla {
namespace dom {
// webidl dictionaries don't have move semantics, which is something that ipdl
// needs for async returns. So, we create a "moveable" subclass that just
// copies. _Really_ lame, but it gets the job done.
struct NotReallyMovableButLetsPretendItIsRTCStatsCollection
: public RTCStatsCollection {
NotReallyMovableButLetsPretendItIsRTCStatsCollection() = default;
explicit NotReallyMovableButLetsPretendItIsRTCStatsCollection(
RTCStatsCollection&& aStats) {
RTCStatsCollection::operator=(aStats);
}
explicit NotReallyMovableButLetsPretendItIsRTCStatsCollection(
const RTCStatsCollection& aStats) {
RTCStatsCollection::operator=(aStats);
}
};
// Calls aFunction with all public members of aStats.
// Typical usage would have aFunction take a parameter pack.
// To avoid inconsistencies, this should be the only explicit list of the
@ -94,21 +78,6 @@ struct ParamTraits<mozilla::dom::RTCIceCandidateType>
mozilla::dom::RTCIceCandidateType::Host,
mozilla::dom::RTCIceCandidateType::EndGuard_> {};
template <>
struct ParamTraits<
mozilla::dom::NotReallyMovableButLetsPretendItIsRTCStatsCollection> {
typedef mozilla::dom::NotReallyMovableButLetsPretendItIsRTCStatsCollection
paramType;
static void Write(MessageWriter* aWriter, const paramType& aParam) {
WriteParam(aWriter,
static_cast<const mozilla::dom::RTCStatsCollection&>(aParam));
}
static bool Read(MessageReader* aReader, paramType* aResult) {
return ReadParam(aReader,
static_cast<mozilla::dom::RTCStatsCollection*>(aResult));
}
};
template <>
struct ParamTraits<mozilla::dom::RTCBundlePolicy>
: public ContiguousEnumSerializer<

View File

@ -1275,35 +1275,17 @@ RefPtr<dom::RTCStatsPromise> MediaTransportHandlerSTS::GetIceStats(
const std::string& aTransportId, DOMHighResTimeStamp aNow) {
MOZ_RELEASE_ASSERT(mInitPromise);
return mInitPromise
->Then(
mStsThread, __func__,
[=, self = RefPtr<MediaTransportHandlerSTS>(this)]() {
UniquePtr<dom::RTCStatsCollection> stats(
new dom::RTCStatsCollection);
if (mIceCtx) {
for (const auto& stream : mIceCtx->GetStreams()) {
if (aTransportId.empty() || aTransportId == stream->GetId()) {
GetIceStats(*stream, aNow, stats.get());
}
}
}
return dom::RTCStatsPromise::CreateAndResolve(std::move(stats),
__func__);
})
->Then(mStsThread, __func__,
[](dom::RTCStatsPromise::ResolveOrRejectValue&& aValue) {
// Eat errors! Caller is using MozPromise::All, and we don't
// want the whole thing to fail if this fails.
if (aValue.IsResolve()) {
return dom::RTCStatsPromise::CreateAndResolve(
std::move(aValue.ResolveValue()), __func__);
}
UniquePtr<dom::RTCStatsCollection> empty(
new dom::RTCStatsCollection);
return dom::RTCStatsPromise::CreateAndResolve(std::move(empty),
__func__);
});
return mInitPromise->Then(mStsThread, __func__, [=, self = RefPtr(this)]() {
UniquePtr<dom::RTCStatsCollection> stats(new dom::RTCStatsCollection);
if (mIceCtx) {
for (const auto& stream : mIceCtx->GetStreams()) {
if (aTransportId.empty() || aTransportId == stream->GetId()) {
GetIceStats(*stream, aNow, stats.get());
}
}
}
return dom::RTCStatsPromise::CreateAndResolve(std::move(stats), __func__);
});
}
RefPtr<MediaTransportHandler::IceLogPromise>

View File

@ -324,47 +324,33 @@ void MediaTransportHandlerIPC::UpdateNetworkState(bool aOnline) {
RefPtr<dom::RTCStatsPromise> MediaTransportHandlerIPC::GetIceStats(
const std::string& aTransportId, DOMHighResTimeStamp aNow) {
using IPCPromise = dom::PMediaTransportChild::GetIceStatsPromise;
return mInitPromise
->Then(
mCallbackThread, __func__,
[aTransportId, aNow, this,
self = RefPtr<MediaTransportHandlerIPC>(this)](bool /*dummy*/) {
if (!mChild) {
return dom::RTCStatsPromise::CreateAndReject(NS_ERROR_FAILURE,
__func__);
}
RefPtr<dom::RTCStatsPromise> promise =
mChild->SendGetIceStats(aTransportId, aNow)
->Then(
mCallbackThread, __func__,
[](const dom::RTCStatsCollection& aStats) {
UniquePtr<dom::RTCStatsCollection> stats(
new dom::RTCStatsCollection(aStats));
return dom::RTCStatsPromise::CreateAndResolve(
std::move(stats), __func__);
},
[](ipc::ResponseRejectReason aReason) {
return dom::RTCStatsPromise::CreateAndReject(
NS_ERROR_FAILURE, __func__);
});
return promise;
},
[](const nsCString& aError) {
return dom::RTCStatsPromise::CreateAndReject(NS_ERROR_FAILURE,
__func__);
})
->Then(mCallbackThread, __func__,
[](dom::RTCStatsPromise::ResolveOrRejectValue&& aValue) {
// Eat errors! Caller is using MozPromise::All, and we don't
// want the whole thing to fail if this fails.
if (aValue.IsResolve()) {
return dom::RTCStatsPromise::CreateAndResolve(
std::move(aValue.ResolveValue()), __func__);
[aTransportId, aNow, this, self = RefPtr(this)](
const InitPromise::ResolveOrRejectValue& aValue) {
if (aValue.IsReject()) {
return IPCPromise::CreateAndResolve(
MakeUnique<dom::RTCStatsCollection>(),
"MediaTransportHandlerIPC::GetIceStats_1");
}
UniquePtr<dom::RTCStatsCollection> empty(
new dom::RTCStatsCollection);
return dom::RTCStatsPromise::CreateAndResolve(std::move(empty),
__func__);
if (!mChild) {
return IPCPromise::CreateAndResolve(
MakeUnique<dom::RTCStatsCollection>(),
"MediaTransportHandlerIPC::GetIceStats_1");
}
return mChild->SendGetIceStats(aTransportId, aNow);
})
->Then(mCallbackThread, __func__,
[](IPCPromise::ResolveOrRejectValue&& aValue) {
if (aValue.IsReject()) {
return dom::RTCStatsPromise::CreateAndResolve(
MakeUnique<dom::RTCStatsCollection>(),
"MediaTransportHandlerIPC::GetIceStats_2");
}
return dom::RTCStatsPromise::CreateAndResolve(
std::move(aValue.ResolveValue()),
"MediaTransportHandlerIPC::GetIceStats_2");
});
}

View File

@ -226,12 +226,9 @@ mozilla::ipc::IPCResult MediaTransportParent::RecvGetIceStats(
[aResolve = std::move(aResolve)](
dom::RTCStatsPromise::ResolveOrRejectValue&& aResult) {
if (aResult.IsResolve()) {
aResolve(
dom::NotReallyMovableButLetsPretendItIsRTCStatsCollection(
*aResult.ResolveValue()));
aResolve(aResult.ResolveValue());
} else {
dom::NotReallyMovableButLetsPretendItIsRTCStatsCollection empty;
aResolve(empty);
aResolve(MakeUnique<dom::RTCStatsCollection>());
}
});