From 543e41f3acaedc8c25be28a5e426cdfe5bb0d383 Mon Sep 17 00:00:00 2001 From: Gerald Squelart Date: Sun, 19 Nov 2023 13:10:29 +0100 Subject: [PATCH] Bug 1332825 - Use move semantics in MozPromise::All() and AllPromiseHolder. 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. --- xpcom/threads/MozPromise.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/xpcom/threads/MozPromise.h b/xpcom/threads/MozPromise.h index 8cc3d51ba0..f97f55bb8d 100644 --- a/xpcom/threads/MozPromise.h +++ b/xpcom/threads/MozPromise.h @@ -229,35 +229,35 @@ private: 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 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(); } @@ -276,8 +276,8 @@ public: RefPtr 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();