Bug 1424647: Prevent race on AllPromiseHolder::mPromise. r?jwwang
If any of the promises gets resolved/rejected prior MozPromise::All completing, it would return nullptr
MozReview-Commit-ID: Lqhv2t2upvF
--- a/xpcom/threads/MozPromise.h
+++ b/xpcom/threads/MozPromise.h
@@ -336,23 +336,24 @@ public:
static RefPtr<AllPromiseType> All(nsISerialEventTarget* aProcessingTarget, nsTArray<RefPtr<MozPromise>>& aPromises)
{
if (aPromises.Length() == 0) {
return AllPromiseType::CreateAndResolve(nsTArray<ResolveValueType>(), __func__);
}
RefPtr<AllPromiseHolder> holder = new AllPromiseHolder(aPromises.Length());
+ RefPtr<AllPromiseType> promise = holder->Promise();
for (size_t i = 0; i < aPromises.Length(); ++i) {
aPromises[i]->Then(aProcessingTarget, __func__,
[holder, i] (ResolveValueType aResolveValue) -> void { holder->Resolve(i, Move(aResolveValue)); },
[holder] (RejectValueType aRejectValue) -> void { holder->Reject(Move(aRejectValue)); }
);
}
- return holder->Promise();
+ return promise;
}
class Request : public MozPromiseRefcountable
{
public:
virtual void Disconnect() = 0;
protected: