Bug 1231975 - Part 3: Break a reference cycle between PendingResolution and DNSRequestChild. r=drno draft
authorByron Campen [:bwc] <docfaraday@gmail.com>
Thu, 07 Apr 2016 13:12:54 -0500
changeset 357940 590238bca757ff3e7c13202f5db1971084fe538d
parent 357939 452841985267cbd5c79fc628b768ee5ac9da36a7
child 357941 d611712e2a7f0a29063ee5765dc66fb7ed9e5b0f
push id16896
push userbcampen@mozilla.com
push dateFri, 29 Apr 2016 21:42:02 +0000
reviewersdrno
bugs1231975
milestone49.0a1
Bug 1231975 - Part 3: Break a reference cycle between PendingResolution and DNSRequestChild. r=drno MozReview-Commit-ID: CS1q6LyUsIe
media/mtransport/nriceresolver.cpp
media/mtransport/nriceresolver.h
--- a/media/mtransport/nriceresolver.cpp
+++ b/media/mtransport/nriceresolver.cpp
@@ -194,42 +194,43 @@ abort:
   return _status;
 }
 
 nsresult NrIceResolver::PendingResolution::OnLookupComplete(
     nsICancelable *request, nsIDNSRecord *record, nsresult status) {
   ASSERT_ON_THREAD(thread_);
   // First check if we've been canceled. This is single-threaded on the STS
   // thread, but cancel() cannot guarantee this event isn't on the queue.
-  if (!canceled_) {
+  if (request_) {
     nr_transport_addr *cb_addr = nullptr;
     nr_transport_addr ta;
     // TODO(jib@mozilla.com): Revisit when we do TURN.
     if (NS_SUCCEEDED(status)) {
       net::NetAddr na;
       if (NS_SUCCEEDED(record->GetNextAddr(port_, &na))) {
         MOZ_ALWAYS_TRUE (nr_netaddr_to_transport_addr(&na, &ta,
                                                       transport_) == 0);
         cb_addr = &ta;
       }
     }
     cb_(cb_arg_, cb_addr);
+    request_ = nullptr;
     Release();
   }
   return NS_OK;
 }
 
 int NrIceResolver::cancel(void *obj, void *handle) {
   MOZ_ALWAYS_TRUE(obj);
   MOZ_ASSERT(handle);
   ASSERT_ON_THREAD(static_cast<NrIceResolver *>(obj)->sts_thread_);
   return static_cast<PendingResolution *>(handle)->cancel();
 }
 
 int NrIceResolver::PendingResolution::cancel() {
   request_->Cancel (NS_ERROR_ABORT);
-  canceled_ = true; // in case OnLookupComplete is already on event queue.
+  request_ = nullptr;
   Release();
   return 0;
 }
 
 NS_IMPL_ISUPPORTS(NrIceResolver::PendingResolution, nsIDNSListener);
 }  // End of namespace mozilla
--- a/media/mtransport/nriceresolver.h
+++ b/media/mtransport/nriceresolver.h
@@ -90,32 +90,30 @@ class NrIceResolver
     PendingResolution(nsIEventTarget *thread,
                       uint16_t port,
                       int transport,
                       int (*cb)(void *cb_arg, nr_transport_addr *addr),
                       void *cb_arg) :
         thread_(thread),
         port_(port),
         transport_(transport),
-        cb_(cb), cb_arg_(cb_arg),
-        canceled_ (false) {}
+        cb_(cb), cb_arg_(cb_arg) {}
     NS_IMETHOD OnLookupComplete(nsICancelable *request, nsIDNSRecord *record,
                                 nsresult status) override;
     int cancel();
     nsCOMPtr<nsICancelable> request_;
     NS_DECL_THREADSAFE_ISUPPORTS
 
    private:
     virtual ~PendingResolution(){};
     nsCOMPtr<nsIEventTarget> thread_;
     uint16_t port_;
     int transport_;
     int (*cb_)(void *cb_arg, nr_transport_addr *addr);
     void *cb_arg_;
-    bool canceled_;
   };
 
   nr_resolver_vtbl* vtbl_;
   nsCOMPtr<nsIEventTarget> sts_thread_;
   nsCOMPtr<nsIDNSService> dns_;
 #ifdef DEBUG
   int allocated_resolvers_;
 #endif