diff --git a/dom/ipc/ProcessHangMonitor.cpp b/dom/ipc/ProcessHangMonitor.cpp index 49edc9cf508b..812922fcaf4c 100644 --- a/dom/ipc/ProcessHangMonitor.cpp +++ b/dom/ipc/ProcessHangMonitor.cpp @@ -11,6 +11,7 @@ #include "js/GCAPI.h" #include "mozilla/Atomics.h" +#include "mozilla/BackgroundHangMonitor.h" #include "mozilla/dom/ContentParent.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/ScriptSettings.h" @@ -115,6 +116,7 @@ class HangMonitorChild void ShutdownOnThread(); static Atomic sInstance; + UniquePtr mForcePaintMonitor; const RefPtr mHangMonitor; Monitor mMonitor; @@ -277,12 +279,18 @@ HangMonitorChild::HangMonitorChild(ProcessHangMonitor* aMonitor) { MOZ_RELEASE_ASSERT(NS_IsMainThread()); mContext = danger::GetJSContext(); + mForcePaintMonitor = + MakeUnique("Gecko_Child_ForcePaint", + 128, /* ms timeout for microhangs */ + 8192 /* ms timeout for permahangs */, + BackgroundHangMonitor::THREAD_PRIVATE); } HangMonitorChild::~HangMonitorChild() { MOZ_RELEASE_ASSERT(NS_IsMainThread()); MOZ_ASSERT(sInstance == this); + mForcePaintMonitor = nullptr; sInstance = nullptr; } @@ -310,6 +318,7 @@ HangMonitorChild::InterruptCallback() JS::AutoAssertOnGC nogc(mContext); JS::AutoAssertOnBarrier nobarrier(mContext); tabChild->ForcePaint(forcePaintEpoch); + mForcePaintMonitor->NotifyWait(); } } } @@ -382,6 +391,8 @@ HangMonitorChild::RecvForcePaint(const TabId& aTabId, const uint64_t& aLayerObse { MOZ_RELEASE_ASSERT(MessageLoop::current() == MonitorLoop()); + mForcePaintMonitor->NotifyActivity(); + { MonitorAutoLock lock(mMonitor); mForcePaint = true;