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
--- 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