Bug 1310880 - Add a specialized BackgroundHangMonitor for content process force paints. r=jchen,billm

MozReview-Commit-ID: CccuQRDuaW2

--HG--
extra : rebase_source : 6a88e7f1f95d8886151b2fb021c9f259a9689670
extra : histedit_source : 0d565810d4055cf669085045e80a0e4ad6d66fe4
This commit is contained in:
Mike Conley 2016-10-19 14:33:13 -04:00
parent f2fa591912
commit 16e7fd83fa

View File

@ -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<HangMonitorChild*> sInstance;
UniquePtr<BackgroundHangMonitor> mForcePaintMonitor;
const RefPtr<ProcessHangMonitor> mHangMonitor;
Monitor mMonitor;
@ -277,12 +279,18 @@ HangMonitorChild::HangMonitorChild(ProcessHangMonitor* aMonitor)
{
MOZ_RELEASE_ASSERT(NS_IsMainThread());
mContext = danger::GetJSContext();
mForcePaintMonitor =
MakeUnique<mozilla::BackgroundHangMonitor>("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;