mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 23:05:42 +00:00
Backed out changeset 34ca2a2e09ea (bug 1133521) for BHR crashes
This commit is contained in:
parent
4d6883e5c6
commit
77e821b69f
@ -2911,20 +2911,21 @@ TelemetryImpl::GetThreadHangStats(JSContext* cx, JS::MutableHandle<JS::Value> re
|
|||||||
}
|
}
|
||||||
size_t threadIndex = 0;
|
size_t threadIndex = 0;
|
||||||
|
|
||||||
if (!BackgroundHangMonitor::IsDisabled()) {
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
/* First add active threads; we need to hold |iter| (and its lock)
|
/* First add active threads; we need to hold |iter| (and its lock)
|
||||||
throughout this method to avoid a race condition where a thread can
|
throughout this method to avoid a race condition where a thread can
|
||||||
be recorded twice if the thread is destroyed while this method is
|
be recorded twice if the thread is destroyed while this method is
|
||||||
running */
|
running */
|
||||||
BackgroundHangMonitor::ThreadHangStatsIterator iter;
|
BackgroundHangMonitor::ThreadHangStatsIterator iter;
|
||||||
for (Telemetry::ThreadHangStats* histogram = iter.GetNext();
|
for (Telemetry::ThreadHangStats* histogram = iter.GetNext();
|
||||||
histogram; histogram = iter.GetNext()) {
|
histogram; histogram = iter.GetNext()) {
|
||||||
JS::RootedObject obj(cx, CreateJSThreadHangStats(cx, *histogram));
|
JS::RootedObject obj(cx,
|
||||||
if (!JS_DefineElement(cx, retObj, threadIndex++, obj, JSPROP_ENUMERATE)) {
|
CreateJSThreadHangStats(cx, *histogram));
|
||||||
return NS_ERROR_FAILURE;
|
if (!JS_DefineElement(cx, retObj, threadIndex++, obj, JSPROP_ENUMERATE)) {
|
||||||
}
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Add saved threads next
|
// Add saved threads next
|
||||||
MutexAutoLock autoLock(mThreadHangStatsMutex);
|
MutexAutoLock autoLock(mThreadHangStatsMutex);
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "mozilla/LinkedList.h"
|
#include "mozilla/LinkedList.h"
|
||||||
#include "mozilla/Monitor.h"
|
#include "mozilla/Monitor.h"
|
||||||
#include "mozilla/Move.h"
|
#include "mozilla/Move.h"
|
||||||
#include "mozilla/Preferences.h"
|
|
||||||
#include "mozilla/StaticPtr.h"
|
#include "mozilla/StaticPtr.h"
|
||||||
#include "mozilla/Telemetry.h"
|
#include "mozilla/Telemetry.h"
|
||||||
#include "mozilla/ThreadHangStats.h"
|
#include "mozilla/ThreadHangStats.h"
|
||||||
@ -21,23 +20,16 @@
|
|||||||
#include "prinrval.h"
|
#include "prinrval.h"
|
||||||
#include "prthread.h"
|
#include "prthread.h"
|
||||||
#include "ThreadStackHelper.h"
|
#include "ThreadStackHelper.h"
|
||||||
#include "nsIObserverService.h"
|
|
||||||
#include "nsIObserver.h"
|
|
||||||
#include "mozilla/Services.h"
|
|
||||||
#include "nsXULAppAPI.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
// Activate BHR only for one every BHR_BETA_MOD users.
|
|
||||||
#define BHR_BETA_MOD 100;
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BackgroundHangManager is the global object that
|
* BackgroundHangManager is the global object that
|
||||||
* manages all instances of BackgroundHangThread.
|
* manages all instances of BackgroundHangThread.
|
||||||
*/
|
*/
|
||||||
class BackgroundHangManager : public nsIObserver
|
class BackgroundHangManager
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
// Background hang monitor thread function
|
// Background hang monitor thread function
|
||||||
@ -69,11 +61,9 @@ private:
|
|||||||
void RunMonitorThread();
|
void RunMonitorThread();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NS_DECL_THREADSAFE_ISUPPORTS
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BackgroundHangManager)
|
||||||
NS_DECL_NSIOBSERVER
|
|
||||||
static StaticRefPtr<BackgroundHangManager> sInstance;
|
static StaticRefPtr<BackgroundHangManager> sInstance;
|
||||||
static bool sProhibited;
|
static bool sProhibited;
|
||||||
static bool sDisabled;
|
|
||||||
|
|
||||||
// Lock for access to members of this class
|
// Lock for access to members of this class
|
||||||
Monitor mLock;
|
Monitor mLock;
|
||||||
@ -100,23 +90,9 @@ public:
|
|||||||
|
|
||||||
BackgroundHangManager();
|
BackgroundHangManager();
|
||||||
private:
|
private:
|
||||||
virtual ~BackgroundHangManager();
|
~BackgroundHangManager();
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS(BackgroundHangManager, nsIObserver)
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
BackgroundHangManager::Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData) {
|
|
||||||
NS_ENSURE_TRUE(!strcmp(aTopic, "profile-after-change"), NS_ERROR_UNEXPECTED);
|
|
||||||
BackgroundHangMonitor::DisableOnBeta();
|
|
||||||
|
|
||||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
|
||||||
MOZ_ASSERT(observerService);
|
|
||||||
observerService->RemoveObserver(this, "profile-after-change");
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BackgroundHangThread is a per-thread object that is used
|
* BackgroundHangThread is a per-thread object that is used
|
||||||
* by all instances of BackgroundHangMonitor to monitor hangs.
|
* by all instances of BackgroundHangMonitor to monitor hangs.
|
||||||
@ -186,7 +162,6 @@ public:
|
|||||||
|
|
||||||
StaticRefPtr<BackgroundHangManager> BackgroundHangManager::sInstance;
|
StaticRefPtr<BackgroundHangManager> BackgroundHangManager::sInstance;
|
||||||
bool BackgroundHangManager::sProhibited = false;
|
bool BackgroundHangManager::sProhibited = false;
|
||||||
bool BackgroundHangManager::sDisabled = false;
|
|
||||||
|
|
||||||
ThreadLocal<BackgroundHangThread*> BackgroundHangThread::sTlsKey;
|
ThreadLocal<BackgroundHangThread*> BackgroundHangThread::sTlsKey;
|
||||||
|
|
||||||
@ -446,7 +421,7 @@ BackgroundHangThread::FindThread()
|
|||||||
{
|
{
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
if (BackgroundHangManager::sInstance == nullptr) {
|
if (BackgroundHangManager::sInstance == nullptr) {
|
||||||
MOZ_ASSERT(BackgroundHangManager::sProhibited || BackgroundHangManager::sDisabled,
|
MOZ_ASSERT(BackgroundHangManager::sProhibited,
|
||||||
"BackgroundHandleManager is not initialized");
|
"BackgroundHandleManager is not initialized");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -475,38 +450,6 @@ BackgroundHangThread::FindThread()
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
BackgroundHangMonitor::ShouldDisableOnBeta(const nsCString &clientID) {
|
|
||||||
MOZ_ASSERT(clientID.Length() == 36, "clientID is invalid");
|
|
||||||
const char *suffix = clientID.get() + clientID.Length() - 4;
|
|
||||||
return strtol(suffix, NULL, 16) % BHR_BETA_MOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
BackgroundHangMonitor::IsDisabled() {
|
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
|
||||||
return BackgroundHangManager::sDisabled;
|
|
||||||
#else
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
BackgroundHangMonitor::DisableOnBeta() {
|
|
||||||
nsAdoptingCString clientID = Preferences::GetCString("toolkit.telemetry.cachedClientID");
|
|
||||||
bool telemetryEnabled = Preferences::GetBool("toolkit.telemetry.enabled");
|
|
||||||
|
|
||||||
if (!telemetryEnabled || !clientID || BackgroundHangMonitor::ShouldDisableOnBeta(clientID)) {
|
|
||||||
if (XRE_IsParentProcess()) {
|
|
||||||
BackgroundHangMonitor::Shutdown();
|
|
||||||
} else {
|
|
||||||
BackgroundHangManager::sDisabled = true;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BackgroundHangMonitor::Startup()
|
BackgroundHangMonitor::Startup()
|
||||||
@ -514,23 +457,6 @@ BackgroundHangMonitor::Startup()
|
|||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
MOZ_ASSERT(!BackgroundHangManager::sProhibited, "Prohibited");
|
MOZ_ASSERT(!BackgroundHangManager::sProhibited, "Prohibited");
|
||||||
MOZ_ASSERT(!BackgroundHangManager::sInstance, "Already initialized");
|
MOZ_ASSERT(!BackgroundHangManager::sInstance, "Already initialized");
|
||||||
|
|
||||||
if (!strcmp(NS_STRINGIFY(MOZ_UPDATE_CHANNEL), "beta")) {
|
|
||||||
if (XRE_IsParentProcess()) { // cached ClientID hasn't been read yet
|
|
||||||
ThreadStackHelper::Startup();
|
|
||||||
BackgroundHangThread::Startup();
|
|
||||||
BackgroundHangManager::sInstance = new BackgroundHangManager();
|
|
||||||
|
|
||||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
|
||||||
MOZ_ASSERT(observerService);
|
|
||||||
|
|
||||||
observerService->AddObserver(BackgroundHangManager::sInstance, "profile-after-change", false);
|
|
||||||
return;
|
|
||||||
} else if(DisableOnBeta()){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ThreadStackHelper::Startup();
|
ThreadStackHelper::Startup();
|
||||||
BackgroundHangThread::Startup();
|
BackgroundHangThread::Startup();
|
||||||
BackgroundHangManager::sInstance = new BackgroundHangManager();
|
BackgroundHangManager::sInstance = new BackgroundHangManager();
|
||||||
@ -541,11 +467,6 @@ void
|
|||||||
BackgroundHangMonitor::Shutdown()
|
BackgroundHangMonitor::Shutdown()
|
||||||
{
|
{
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
if (BackgroundHangManager::sDisabled) {
|
|
||||||
MOZ_ASSERT(!BackgroundHangManager::sInstance, "Initialized");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOZ_ASSERT(!BackgroundHangManager::sProhibited, "Prohibited");
|
MOZ_ASSERT(!BackgroundHangManager::sProhibited, "Prohibited");
|
||||||
MOZ_ASSERT(BackgroundHangManager::sInstance, "Not initialized");
|
MOZ_ASSERT(BackgroundHangManager::sInstance, "Not initialized");
|
||||||
/* Scope our lock inside Shutdown() because the sInstance object can
|
/* Scope our lock inside Shutdown() because the sInstance object can
|
||||||
@ -554,7 +475,6 @@ BackgroundHangMonitor::Shutdown()
|
|||||||
BackgroundHangManager::sInstance->Shutdown();
|
BackgroundHangManager::sInstance->Shutdown();
|
||||||
BackgroundHangManager::sInstance = nullptr;
|
BackgroundHangManager::sInstance = nullptr;
|
||||||
ThreadStackHelper::Shutdown();
|
ThreadStackHelper::Shutdown();
|
||||||
BackgroundHangManager::sDisabled = true;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,7 +484,7 @@ BackgroundHangMonitor::BackgroundHangMonitor(const char* aName,
|
|||||||
: mThread(BackgroundHangThread::FindThread())
|
: mThread(BackgroundHangThread::FindThread())
|
||||||
{
|
{
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
if (!BackgroundHangManager::sDisabled && !BackgroundHangManager::sProhibited && !mThread) {
|
if (!BackgroundHangManager::sProhibited && !mThread) {
|
||||||
// If sProhibit is true, mThread would be null, and no monitoring.
|
// If sProhibit is true, mThread would be null, and no monitoring.
|
||||||
mThread = new BackgroundHangThread(aName, aTimeoutMs, aMaxTimeoutMs);
|
mThread = new BackgroundHangThread(aName, aTimeoutMs, aMaxTimeoutMs);
|
||||||
}
|
}
|
||||||
@ -575,10 +495,6 @@ BackgroundHangMonitor::BackgroundHangMonitor()
|
|||||||
: mThread(BackgroundHangThread::FindThread())
|
: mThread(BackgroundHangThread::FindThread())
|
||||||
{
|
{
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
if (BackgroundHangManager::sDisabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOZ_ASSERT(!BackgroundHangManager::sProhibited || mThread,
|
MOZ_ASSERT(!BackgroundHangManager::sProhibited || mThread,
|
||||||
"This thread is not initialized for hang monitoring");
|
"This thread is not initialized for hang monitoring");
|
||||||
#endif
|
#endif
|
||||||
@ -593,8 +509,7 @@ BackgroundHangMonitor::NotifyActivity()
|
|||||||
{
|
{
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
if (mThread == nullptr) {
|
if (mThread == nullptr) {
|
||||||
MOZ_ASSERT(BackgroundHangManager::sProhibited ||
|
MOZ_ASSERT(BackgroundHangManager::sProhibited,
|
||||||
BackgroundHangManager::sDisabled,
|
|
||||||
"This thread is not initialized for hang monitoring");
|
"This thread is not initialized for hang monitoring");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -610,8 +525,7 @@ BackgroundHangMonitor::NotifyWait()
|
|||||||
{
|
{
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
if (mThread == nullptr) {
|
if (mThread == nullptr) {
|
||||||
MOZ_ASSERT(BackgroundHangManager::sProhibited ||
|
MOZ_ASSERT(BackgroundHangManager::sProhibited,
|
||||||
BackgroundHangManager::sDisabled,
|
|
||||||
"This thread is not initialized for hang monitoring");
|
"This thread is not initialized for hang monitoring");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -653,9 +567,7 @@ BackgroundHangMonitor::ThreadHangStatsIterator::ThreadHangStatsIterator()
|
|||||||
nullptr)
|
nullptr)
|
||||||
{
|
{
|
||||||
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
#ifdef MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
MOZ_ASSERT(BackgroundHangManager::sInstance ||
|
MOZ_ASSERT(BackgroundHangManager::sInstance || BackgroundHangManager::sProhibited,
|
||||||
BackgroundHangManager::sProhibited ||
|
|
||||||
BackgroundHangManager::sDisabled,
|
|
||||||
"Inconsistent state");
|
"Inconsistent state");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,6 @@
|
|||||||
#include "mozilla/RefPtr.h"
|
#include "mozilla/RefPtr.h"
|
||||||
#include "mozilla/Monitor.h"
|
#include "mozilla/Monitor.h"
|
||||||
|
|
||||||
#include "nsString.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
@ -20,8 +18,14 @@ namespace Telemetry {
|
|||||||
class ThreadHangStats;
|
class ThreadHangStats;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Disabled for Beta/Release builds because of bug 965392.
|
||||||
|
// Disabled for debug builds because of bug 979069.
|
||||||
|
#if !defined(RELEASE_BUILD) && !defined(DEBUG)
|
||||||
|
// Undefine to disable background hang monitor
|
||||||
|
#define MOZ_ENABLE_BACKGROUND_HANG_MONITOR
|
||||||
|
#endif
|
||||||
|
|
||||||
class BackgroundHangThread;
|
class BackgroundHangThread;
|
||||||
class BackgroundHangManager;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The background hang monitor is responsible for detecting and reporting
|
* The background hang monitor is responsible for detecting and reporting
|
||||||
@ -109,13 +113,8 @@ class BackgroundHangManager;
|
|||||||
class BackgroundHangMonitor
|
class BackgroundHangMonitor
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
friend BackgroundHangManager;
|
|
||||||
|
|
||||||
RefPtr<BackgroundHangThread> mThread;
|
RefPtr<BackgroundHangThread> mThread;
|
||||||
|
|
||||||
static bool ShouldDisableOnBeta(const nsCString &);
|
|
||||||
static bool DisableOnBeta();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const uint32_t kNoTimeout = 0;
|
static const uint32_t kNoTimeout = 0;
|
||||||
|
|
||||||
@ -169,11 +168,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if BHR is disabled.
|
|
||||||
*/
|
|
||||||
static bool IsDisabled();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start monitoring hangs for the current thread.
|
* Start monitoring hangs for the current thread.
|
||||||
*
|
*
|
||||||
|
@ -59,11 +59,6 @@ LOCAL_INCLUDES += [
|
|||||||
'/tools/profiler',
|
'/tools/profiler',
|
||||||
]
|
]
|
||||||
|
|
||||||
# BHR disabled for Release builds because of bug 965392.
|
|
||||||
# BHR disabled for debug builds because of bug 979069.
|
|
||||||
if CONFIG['MOZ_UPDATE_CHANNEL'] not in ('release') and not CONFIG['DEBUG']:
|
|
||||||
DEFINES['MOZ_ENABLE_BACKGROUND_HANG_MONITOR'] = 1
|
|
||||||
|
|
||||||
FAIL_ON_WARNINGS = True
|
FAIL_ON_WARNINGS = True
|
||||||
|
|
||||||
FINAL_LIBRARY = 'xul'
|
FINAL_LIBRARY = 'xul'
|
||||||
|
Loading…
Reference in New Issue
Block a user