Bug 1407542 - Implement MediaStreamGraph::GetInstanceIfExists. r?padenot
MozReview-Commit-ID: EAd0rIrZg43
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -54,16 +54,18 @@ LazyLogModule gMediaStreamGraphLog("Medi
enum SourceMediaStream::TrackCommands : uint32_t {
TRACK_CREATE = TrackEventCommand::TRACK_EVENT_CREATED,
TRACK_END = TrackEventCommand::TRACK_EVENT_ENDED,
TRACK_UNUSED = TrackEventCommand::TRACK_EVENT_UNUSED,
};
/**
* A hash table containing the graph instances, one per document.
+ *
+ * The key is a hash of nsPIDOMWindowInner, see `WindowToHash`.
*/
static nsDataHashtable<nsUint32HashKey, MediaStreamGraphImpl*> gGraphs;
MediaStreamGraphImpl::~MediaStreamGraphImpl()
{
NS_ASSERTION(IsEmpty(),
"All streams should have been destroyed by messages from the main thread");
LOG(LogLevel::Debug, ("MediaStreamGraph %p destroyed", this));
@@ -3493,30 +3495,37 @@ uint32_t WindowToHash(nsPIDOMWindowInner
uint32_t hashkey = 0;
hashkey = AddToHash(hashkey, aWindow);
return hashkey;
}
MediaStreamGraph*
+MediaStreamGraph::GetInstanceIfExists(nsPIDOMWindowInner* aWindow)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Main thread only");
+
+ uint32_t hashkey = WindowToHash(aWindow);
+
+ MediaStreamGraphImpl* graph = nullptr;
+ gGraphs.Get(hashkey, &graph);
+ return graph;
+}
+
+MediaStreamGraph*
MediaStreamGraph::GetInstance(MediaStreamGraph::GraphDriverType aGraphDriverRequested,
nsPIDOMWindowInner* aWindow)
{
NS_ASSERTION(NS_IsMainThread(), "Main thread only");
- MediaStreamGraphImpl* graph = nullptr;
-
- // We hash the nsPIDOMWindowInner to form a key to the gloabl
- // MediaStreamGraph hashtable. Effectively, this means there is a graph per
- // document.
-
- uint32_t hashkey = WindowToHash(aWindow);
-
- if (!gGraphs.Get(hashkey, &graph)) {
+ MediaStreamGraphImpl* graph =
+ static_cast<MediaStreamGraphImpl*>(GetInstanceIfExists(aWindow));
+
+ if (!graph) {
if (!gMediaStreamGraphShutdownBlocker) {
class Blocker : public media::ShutdownBlocker
{
public:
Blocker()
: media::ShutdownBlocker(NS_LITERAL_STRING(
"MediaStreamGraph shutdown: blocking on msg thread"))
@@ -3554,16 +3563,17 @@ MediaStreamGraph::GetInstance(MediaStrea
} else {
// Uncommon case, only for some old configuration of webspeech.
mainThread = AbstractThread::MainThread();
}
graph = new MediaStreamGraphImpl(aGraphDriverRequested,
CubebUtils::PreferredSampleRate(),
mainThread);
+ uint32_t hashkey = WindowToHash(aWindow);
gGraphs.Put(hashkey, graph);
LOG(LogLevel::Debug,
("Starting up MediaStreamGraph %p for window %p", graph, aWindow));
}
return graph;
}
--- a/dom/media/MediaStreamGraph.h
+++ b/dom/media/MediaStreamGraph.h
@@ -1259,16 +1259,17 @@ public:
enum GraphDriverType {
AUDIO_THREAD_DRIVER,
SYSTEM_THREAD_DRIVER,
OFFLINE_THREAD_DRIVER
};
static const uint32_t AUDIO_CALLBACK_DRIVER_SHUTDOWN_TIMEOUT = 20*1000;
// Main thread only
+ static MediaStreamGraph* GetInstanceIfExists(nsPIDOMWindowInner* aWindow);
static MediaStreamGraph* GetInstance(GraphDriverType aGraphDriverRequested,
nsPIDOMWindowInner* aWindow);
static MediaStreamGraph* CreateNonRealtimeInstance(
TrackRate aSampleRate,
nsPIDOMWindowInner* aWindowId);
// Return the correct main thread for this graph. This always returns
// something that is valid. Thread safe.