From 8ebe4e8e553d84d8a653adcab196d8f3a6fe2183 Mon Sep 17 00:00:00 2001 From: Cameron Kaiser Date: Thu, 26 Apr 2018 21:44:21 -0700 Subject: [PATCH] #491: new fix for M1452416 --- dom/media/MediaStreamGraph.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/dom/media/MediaStreamGraph.cpp b/dom/media/MediaStreamGraph.cpp index eeeaba5eb..42438e980 100644 --- a/dom/media/MediaStreamGraph.cpp +++ b/dom/media/MediaStreamGraph.cpp @@ -57,6 +57,26 @@ LazyLogModule gMediaStreamGraphLog("MediaStreamGraph"); # define LIFECYCLE_LOG(...) #endif +// Fix for bug 1452416, since we don't have the proper form of +// NS_ReleaseOnMainThread(). This is based on our fix for M1348955 +// et al. as demonstrated in TenFourFox issue 478. +template +class ProxyReleaseEvent : public nsRunnable +{ +public: + explicit ProxyReleaseEvent(already_AddRefed aDoomed) + : mDoomed(aDoomed.take()) {} + + NS_IMETHOD Run() override + { + NS_IF_RELEASE(mDoomed); + return NS_OK; + } + +private: + T* MOZ_OWNING_REF mDoomed; +}; + /** * A hash table containing the graph instances, one per AudioChannel. */ @@ -1497,6 +1517,12 @@ MediaStreamGraphImpl::RunInStableState(bool aSourceIsMSG) RefPtr driver = CurrentDriver(); MonitorAutoUnlock unlock(mMonitor); driver->Start(); + // It's not safe to Shutdown() a thread from StableState, and + // releasing this may shutdown a SystemClockDriver thread. + // Proxy the release to outside of StableState. + // NS_ReleaseOnMainThread(driver.forget(), true); // always proxy + nsCOMPtr event = new ProxyReleaseEvent(driver.forget()); + NS_DispatchToMainThread(event.forget()); } }