Bug 1424647: Prevent race on AllPromiseHolder::mPromise. r?jwwang draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Sun, 10 Dec 2017 23:31:04 +0100
changeset 710551 09347d74044272606cc1a815e6a1517ee61e4f27
parent 710550 4fa9f48be4a94c0dc3ca2badb4a3cd613c46849e
child 743600 f25ead0cc8f7ebf5a4e12afec427c8acde24bfd4
push id92845
push userbmo:jyavenard@mozilla.com
push dateSun, 10 Dec 2017 22:43:10 +0000
reviewersjwwang
bugs1424647
milestone59.0a1
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
xpcom/threads/MozPromise.h
--- 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: