Bug 1411322 - Simplify MediaRecorderReporter. r?SingingTree draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Fri, 10 Nov 2017 11:58:33 +0100
changeset 696536 683ed14128b9194c24cfd81c1785170e92fe9109
parent 696535 520881da90f5be962d91733b9263d79d02121e19
child 696537 a8f30f3e2f2712412289d5dd797f055ce9aa69eb
push id88745
push userbmo:apehrson@mozilla.com
push dateFri, 10 Nov 2017 20:53:59 +0000
reviewersSingingTree
bugs1411322
milestone58.0a1
Bug 1411322 - Simplify MediaRecorderReporter. r?SingingTree This is primarily to improve code readability of the reporter's lifetime. Creation of the singleton was hidden away in GetRecorders(). Both creation and destruction is now more explicit in {Add|Remove}MediaRecorder. MozReview-Commit-ID: CqxgPQ1JptK
dom/media/MediaRecorder.cpp
--- a/dom/media/MediaRecorder.cpp
+++ b/dom/media/MediaRecorder.cpp
@@ -59,42 +59,48 @@ static nsTHashtable<nsRefPtrHashKey<Medi
  *
  * It is a singleton reporter and the single class object lives as long as at
  * least one Recorder is registered. In MediaRecorder, the reporter is unregistered
  * when it is destroyed.
  */
 class MediaRecorderReporter final : public nsIMemoryReporter
 {
 public:
-  NS_DECL_THREADSAFE_ISUPPORTS
-  MediaRecorderReporter() {};
-  static MediaRecorderReporter* UniqueInstance();
-  void InitMemoryReporter();
-
   static void AddMediaRecorder(MediaRecorder *aRecorder)
   {
-    GetRecorders().AppendElement(aRecorder);
+    if (!sUniqueInstance) {
+      sUniqueInstance = MakeAndAddRef<MediaRecorderReporter>();
+      RegisterWeakAsyncMemoryReporter(sUniqueInstance);
+    }
+    sUniqueInstance->mRecorders.AppendElement(aRecorder);
   }
 
   static void RemoveMediaRecorder(MediaRecorder *aRecorder)
   {
-    RecordersArray& recorders = GetRecorders();
-    recorders.RemoveElement(aRecorder);
-    if (recorders.IsEmpty()) {
+    if (!sUniqueInstance) {
+      return;
+    }
+
+    sUniqueInstance->mRecorders.RemoveElement(aRecorder);
+    if (sUniqueInstance->mRecorders.IsEmpty()) {
+      UnregisterWeakMemoryReporter(sUniqueInstance);
       sUniqueInstance = nullptr;
     }
   }
 
+  NS_DECL_THREADSAFE_ISUPPORTS
+
+  MediaRecorderReporter() = default;
+
   NS_IMETHOD
   CollectReports(nsIHandleReportCallback* aHandleReport,
                  nsISupports* aData, bool aAnonymize) override
   {
-    RecordersArray& recorders = GetRecorders();
     nsTArray<RefPtr<MediaRecorder::SizeOfPromise>> promises;
-    for (const RefPtr<MediaRecorder>& recorder: recorders) {
+    for (const RefPtr<MediaRecorder>& recorder: mRecorders) {
       promises.AppendElement(recorder->SizeOfExcludingThis(MallocSizeOf));
     }
 
     nsCOMPtr<nsIHandleReportCallback> handleReport = aHandleReport;
     nsCOMPtr<nsISupports> data = aData;
     MediaRecorder::SizeOfPromise::All(GetCurrentThreadSerialEventTarget(), promises)
       ->Then(GetCurrentThreadSerialEventTarget(), __func__,
           [handleReport, data](const nsTArray<size_t>& sizes) {
@@ -111,24 +117,25 @@ public:
           },
           [](size_t) { MOZ_CRASH("Unexpected reject"); });
 
     return NS_OK;
   }
 
 private:
   MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf)
-  virtual ~MediaRecorderReporter();
+
+  virtual ~MediaRecorderReporter()
+  {
+    MOZ_ASSERT(mRecorders.IsEmpty(), "All recorders must have been removed");
+  }
+
   static StaticRefPtr<MediaRecorderReporter> sUniqueInstance;
-  typedef nsTArray<MediaRecorder*> RecordersArray;
-  static RecordersArray& GetRecorders()
-  {
-    return UniqueInstance()->mRecorders;
-  }
-  RecordersArray mRecorders;
+
+  nsTArray<RefPtr<MediaRecorder>> mRecorders;
 };
 NS_IMPL_ISUPPORTS(MediaRecorderReporter, nsIMemoryReporter);
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(MediaRecorder)
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaRecorder,
                                                   DOMEventTargetHelper)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDOMStream)
@@ -1688,29 +1695,10 @@ MediaRecorder::SizeOfExcludingThis(mozil
       MOZ_CRASH("Unexpected reject");
     });
 
   return promise;
 }
 
 StaticRefPtr<MediaRecorderReporter> MediaRecorderReporter::sUniqueInstance;
 
-MediaRecorderReporter* MediaRecorderReporter::UniqueInstance()
-{
-  if (!sUniqueInstance) {
-    sUniqueInstance = new MediaRecorderReporter();
-    sUniqueInstance->InitMemoryReporter();
-  }
-  return sUniqueInstance;
- }
-
-void MediaRecorderReporter::InitMemoryReporter()
-{
-  RegisterWeakAsyncMemoryReporter(this);
-}
-
-MediaRecorderReporter::~MediaRecorderReporter()
-{
-  UnregisterWeakMemoryReporter(this);
-}
-
 } // namespace dom
 } // namespace mozilla