Bug 1332825 - Use move semantics in MozPromise::All() and AllPromiseHolder - r?jwwang
MozPromise::All sets up 'Then' lambdas on all sub-promises, each one taking the
resolve/reject object by value.
Since this value will not be used again in the lambda, it is safe to Move it,
and from there MozPromiseHolder::Resolve/Reject can also Move it again into the
holder storage, potentially saving two copies per Resolve/Reject.
Also, once all sub-promises have been resolved, the resolve-values can be
Move'd into the joining promise's Resolve function.
MozReview-Commit-ID: 5oxgNEnE5lq
--- a/xpcom/threads/MozPromise.h
+++ b/xpcom/threads/MozPromise.h
@@ -215,45 +215,45 @@ private:
public:
explicit AllPromiseHolder(size_t aDependentPromises)
: mPromise(new typename AllPromiseType::Private(__func__))
, mOutstandingPromises(aDependentPromises)
{
mResolveValues.SetLength(aDependentPromises);
}
- void Resolve(size_t aIndex, const ResolveValueType& aResolveValue)
+ void Resolve(size_t aIndex, ResolveValueType&& aResolveValue)
{
if (!mPromise) {
// Already rejected.
return;
}
- mResolveValues[aIndex].emplace(aResolveValue);
+ mResolveValues[aIndex].emplace(Move(aResolveValue));
if (--mOutstandingPromises == 0) {
nsTArray<ResolveValueType> resolveValues;
resolveValues.SetCapacity(mResolveValues.Length());
for (size_t i = 0; i < mResolveValues.Length(); ++i) {
- resolveValues.AppendElement(mResolveValues[i].ref());
+ resolveValues.AppendElement(Move(mResolveValues[i].ref()));
}
- mPromise->Resolve(resolveValues, __func__);
+ mPromise->Resolve(Move(resolveValues), __func__);
mPromise = nullptr;
mResolveValues.Clear();
}
}
- void Reject(const RejectValueType& aRejectValue)
+ void Reject(RejectValueType&& aRejectValue)
{
if (!mPromise) {
// Already rejected.
return;
}
- mPromise->Reject(aRejectValue, __func__);
+ mPromise->Reject(Move(aRejectValue), __func__);
mPromise = nullptr;
mResolveValues.Clear();
}
AllPromiseType* Promise() { return mPromise; }
private:
nsTArray<Maybe<ResolveValueType>> mResolveValues;
@@ -262,18 +262,18 @@ private:
};
public:
static RefPtr<AllPromiseType> All(AbstractThread* aProcessingThread, nsTArray<RefPtr<MozPromise>>& aPromises)
{
RefPtr<AllPromiseHolder> holder = new AllPromiseHolder(aPromises.Length());
for (size_t i = 0; i < aPromises.Length(); ++i) {
aPromises[i]->Then(aProcessingThread, __func__,
- [holder, i] (ResolveValueType aResolveValue) -> void { holder->Resolve(i, aResolveValue); },
- [holder] (RejectValueType aRejectValue) -> void { holder->Reject(aRejectValue); }
+ [holder, i] (ResolveValueType aResolveValue) -> void { holder->Resolve(i, Move(aResolveValue)); },
+ [holder] (RejectValueType aRejectValue) -> void { holder->Reject(Move(aRejectValue)); }
);
}
return holder->Promise();
}
class Request : public MozPromiseRefcountable
{
public: