--- a/dom/ipc/ProcessHangMonitor.cpp
+++ b/dom/ipc/ProcessHangMonitor.cpp
@@ -241,16 +241,22 @@ public:
*/
void UpdateMinidump(uint32_t aPluginId, const nsString& aDumpId);
MessageLoop* MonitorLoop() { return mHangMonitor->MonitorLoop(); }
private:
bool TakeBrowserMinidump(const PluginHangData& aPhd, nsString& aCrashId);
+ void SendHangNotification(const HangData& aHangData,
+ const nsString& aBrowserDumpId,
+ bool aTakeMinidump);
+
+ void ClearHangNotification();
+
void DispatchTabChildNotReady(TabId aTabId);
void ForcePaintOnThread(TabId aTabId, uint64_t aLayerObserverEpoch);
void ShutdownOnThread();
const RefPtr<ProcessHangMonitor> mHangMonitor;
@@ -696,65 +702,55 @@ void
HangMonitorParent::Bind(Endpoint<PProcessHangMonitorParent>&& aEndpoint)
{
MOZ_RELEASE_ASSERT(MessageLoop::current() == MonitorLoop());
DebugOnly<bool> ok = aEndpoint.Bind(this);
MOZ_ASSERT(ok);
}
-class HangObserverNotifier final : public Runnable
+void
+HangMonitorParent::SendHangNotification(const HangData& aHangData,
+ const nsString& aBrowserDumpId,
+ bool aTakeMinidump)
{
-public:
- HangObserverNotifier(HangMonitoredProcess* aProcess,
- HangMonitorParent *aParent,
- const HangData& aHangData,
- const nsString& aBrowserDumpId,
- bool aTakeMinidump)
- : mProcess(aProcess),
- mParent(aParent),
- mHangData(aHangData),
- mBrowserDumpId(aBrowserDumpId),
- mTakeMinidump(aTakeMinidump)
- {}
+ // chrome process, main thread
+ MOZ_RELEASE_ASSERT(NS_IsMainThread());
- NS_IMETHOD
- Run() override
- {
- // chrome process, main thread
- MOZ_RELEASE_ASSERT(NS_IsMainThread());
-
- nsString dumpId;
- if ((mHangData.type() == HangData::TPluginHangData) && mTakeMinidump) {
- // We've been handed a partial minidump; complete it with plugin and
- // content process dumps.
- const PluginHangData& phd = mHangData.get_PluginHangData();
- plugins::TakeFullMinidump(phd.pluginId(), phd.contentProcessId(),
- mBrowserDumpId, dumpId);
- mParent->UpdateMinidump(phd.pluginId(), dumpId);
- } else {
- // We already have a full minidump; go ahead and use it.
- dumpId = mBrowserDumpId;
- }
-
- mProcess->SetHangData(mHangData, dumpId);
-
- nsCOMPtr<nsIObserverService> observerService =
- mozilla::services::GetObserverService();
- observerService->NotifyObservers(mProcess, "process-hang-report", nullptr);
- return NS_OK;
+ nsString dumpId;
+ if ((aHangData.type() == HangData::TPluginHangData) && aTakeMinidump) {
+ // We've been handed a partial minidump; complete it with plugin and
+ // content process dumps.
+ const PluginHangData& phd = aHangData.get_PluginHangData();
+ plugins::TakeFullMinidump(phd.pluginId(), phd.contentProcessId(),
+ aBrowserDumpId, dumpId);
+ UpdateMinidump(phd.pluginId(), dumpId);
+ } else {
+ // We already have a full minidump; go ahead and use it.
+ dumpId = aBrowserDumpId;
}
-private:
- RefPtr<HangMonitoredProcess> mProcess;
- HangMonitorParent* mParent;
- HangData mHangData;
- nsAutoString mBrowserDumpId;
- bool mTakeMinidump;
-};
+ mProcess->SetHangData(aHangData, dumpId);
+
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ observerService->NotifyObservers(mProcess, "process-hang-report", nullptr);
+}
+
+void
+HangMonitorParent::ClearHangNotification()
+{
+ // chrome process, main thread
+ MOZ_RELEASE_ASSERT(NS_IsMainThread());
+ mProcess->ClearHang();
+
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ observerService->NotifyObservers(mProcess, "clear-hang-report", nullptr);
+}
// Take a minidump of the browser process if one wasn't already taken for the
// plugin that caused the hang. Return false if a dump was already available or
// true if new one has been taken.
bool
HangMonitorParent::TakeBrowserMinidump(const PluginHangData& aPhd,
nsString& aCrashId)
{
@@ -812,64 +808,41 @@ HangMonitorParent::RecvHangEvidence(cons
if (aHangData.type() == HangData::TPluginHangData) {
takeMinidump = TakeBrowserMinidump(aHangData.get_PluginHangData(), crashId);
}
mHangMonitor->InitiateCPOWTimeout();
MonitorAutoLock lock(mMonitor);
- nsCOMPtr<nsIRunnable> notifier =
- new HangObserverNotifier(mProcess, this, aHangData, crashId, takeMinidump);
- NS_DispatchToMainThread(notifier);
+ NS_DispatchToMainThread(
+ mMainThreadTaskFactory.NewRunnableMethod(
+ &HangMonitorParent::SendHangNotification, aHangData, crashId,
+ takeMinidump));
return IPC_OK();
}
-class ClearHangNotifier final : public Runnable
-{
-public:
- explicit ClearHangNotifier(HangMonitoredProcess* aProcess)
- : mProcess(aProcess)
- {}
-
- NS_IMETHOD
- Run() override
- {
- // chrome process, main thread
- MOZ_RELEASE_ASSERT(NS_IsMainThread());
- mProcess->ClearHang();
-
- nsCOMPtr<nsIObserverService> observerService =
- mozilla::services::GetObserverService();
- observerService->NotifyObservers(mProcess, "clear-hang-report", nullptr);
- return NS_OK;
- }
-
-private:
- RefPtr<HangMonitoredProcess> mProcess;
-};
-
mozilla::ipc::IPCResult
HangMonitorParent::RecvClearHang()
{
// chrome process, background thread
MOZ_RELEASE_ASSERT(MessageLoop::current() == MonitorLoop());
if (!mReportHangs) {
return IPC_OK();
}
mHangMonitor->InitiateCPOWTimeout();
MonitorAutoLock lock(mMonitor);
- nsCOMPtr<nsIRunnable> notifier =
- new ClearHangNotifier(mProcess);
- NS_DispatchToMainThread(notifier);
+ NS_DispatchToMainThread(
+ mMainThreadTaskFactory.NewRunnableMethod(
+ &HangMonitorParent::ClearHangNotification));
return IPC_OK();
}
void
HangMonitorParent::TerminateScript()
{
MOZ_RELEASE_ASSERT(MessageLoop::current() == MonitorLoop());