summaryrefslogtreecommitdiff
path: root/xpcom/threads/BackgroundHangMonitor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xpcom/threads/BackgroundHangMonitor.cpp')
-rw-r--r--xpcom/threads/BackgroundHangMonitor.cpp124
1 files changed, 8 insertions, 116 deletions
diff --git a/xpcom/threads/BackgroundHangMonitor.cpp b/xpcom/threads/BackgroundHangMonitor.cpp
index 7af342c8c9..b0b41e291e 100644
--- a/xpcom/threads/BackgroundHangMonitor.cpp
+++ b/xpcom/threads/BackgroundHangMonitor.cpp
@@ -10,13 +10,10 @@
#include "mozilla/Move.h"
#include "mozilla/Preferences.h"
#include "mozilla/StaticPtr.h"
-#include "mozilla/Telemetry.h"
-#include "mozilla/ThreadHangStats.h"
#include "mozilla/ThreadLocal.h"
#include "prinrval.h"
#include "prthread.h"
-#include "ThreadStackHelper.h"
#include "nsIObserverService.h"
#include "nsIObserver.h"
#include "mozilla/Services.h"
@@ -30,7 +27,7 @@
#define BHR_BETA_MOD 1;
// Maximum depth of the call stack in the reported thread hangs. This value represents
-// the 99.9th percentile of the thread hangs stack depths reported by Telemetry.
+// the 99.9th percentile of the thread hangs stack depths reported.
static const size_t kMaxThreadHangStackDepth = 30;
// An utility comparator function used by std::unique to collapse "(* script)" entries in
@@ -174,12 +171,6 @@ public:
bool mWaiting;
// Is the thread dedicated to a single BackgroundHangMonitor
BackgroundHangMonitor::ThreadType mThreadType;
- // Platform-specific helper to get hang stacks
- ThreadStackHelper mStackHelper;
- // Stack of current hang
- Telemetry::HangStack mHangStack;
- // Statistics for telemetry
- Telemetry::ThreadHangStats mStats;
// Annotations for the current hang
UniquePtr<HangMonitor::HangAnnotations> mAnnotations;
// Annotators registered for this thread
@@ -190,10 +181,6 @@ public:
uint32_t aMaxTimeoutMs,
BackgroundHangMonitor::ThreadType aThreadType = BackgroundHangMonitor::THREAD_SHARED);
- // Report a hang; aManager->mLock IS locked
- Telemetry::HangHistogram& ReportHang(PRIntervalTime aHangTime);
- // Report a permanent hang; aManager->mLock IS locked
- void ReportPermaHang();
// Called by BackgroundHangMonitor::NotifyActivity
void NotifyActivity()
{
@@ -325,14 +312,12 @@ BackgroundHangManager::RunMonitorThread()
// Skip subsequent iterations and tolerate a race on mWaiting here
currentThread->mWaiting = true;
currentThread->mHanging = false;
- currentThread->ReportPermaHang();
continue;
}
if (MOZ_LIKELY(!currentThread->mHanging)) {
if (MOZ_UNLIKELY(hangTime >= currentThread->mTimeout)) {
// A hang started
- currentThread->mStackHelper.GetStack(currentThread->mHangStack);
currentThread->mHangStart = interval;
currentThread->mHanging = true;
currentThread->mAnnotations =
@@ -341,7 +326,6 @@ BackgroundHangManager::RunMonitorThread()
} else {
if (MOZ_LIKELY(interval != currentThread->mHangStart)) {
// A hang ended
- currentThread->ReportHang(intervalNow - currentThread->mHangStart);
currentThread->mHanging = false;
}
}
@@ -390,7 +374,6 @@ BackgroundHangThread::BackgroundHangThread(const char* aName,
, mHanging(false)
, mWaiting(true)
, mThreadType(aThreadType)
- , mStats(aName)
{
if (sTlsKeyInitialized && IsShared()) {
sTlsKey.set(this);
@@ -416,69 +399,6 @@ BackgroundHangThread::~BackgroundHangThread()
if (sTlsKeyInitialized && IsShared()) {
sTlsKey.set(nullptr);
}
-
- // Move our copy of ThreadHangStats to Telemetry storage
- Telemetry::RecordThreadHangStats(mStats);
-}
-
-Telemetry::HangHistogram&
-BackgroundHangThread::ReportHang(PRIntervalTime aHangTime)
-{
- // Recovered from a hang; called on the monitor thread
- // mManager->mLock IS locked
-
- // Remove unwanted "js::RunScript" frame from the stack
- for (size_t i = 0; i < mHangStack.length(); ) {
- const char** f = mHangStack.begin() + i;
- if (!mHangStack.IsInBuffer(*f) && !strcmp(*f, "js::RunScript")) {
- mHangStack.erase(f);
- } else {
- i++;
- }
- }
-
- // Collapse duplicated "(chrome script)" and "(content script)" entries in the stack.
- auto it = std::unique(mHangStack.begin(), mHangStack.end(), StackScriptEntriesCollapser);
- mHangStack.erase(it, mHangStack.end());
-
- // Limit the depth of the reported stack if greater than our limit. Only keep its
- // last entries, since the most recent frames are at the end of the vector.
- if (mHangStack.length() > kMaxThreadHangStackDepth) {
- const int elementsToRemove = mHangStack.length() - kMaxThreadHangStackDepth;
- // Replace the oldest frame with a known label so that we can tell this stack
- // was limited.
- mHangStack[0] = "(reduced stack)";
- mHangStack.erase(mHangStack.begin() + 1, mHangStack.begin() + elementsToRemove);
- }
-
- Telemetry::HangHistogram newHistogram(Move(mHangStack));
- for (Telemetry::HangHistogram* oldHistogram = mStats.mHangs.begin();
- oldHistogram != mStats.mHangs.end(); oldHistogram++) {
- if (newHistogram == *oldHistogram) {
- // New histogram matches old one
- oldHistogram->Add(aHangTime, Move(mAnnotations));
- return *oldHistogram;
- }
- }
- // Add new histogram
- newHistogram.Add(aHangTime, Move(mAnnotations));
- if (!mStats.mHangs.append(Move(newHistogram))) {
- MOZ_CRASH();
- }
- return mStats.mHangs.back();
-}
-
-void
-BackgroundHangThread::ReportPermaHang()
-{
- // Permanently hanged; called on the monitor thread
- // mManager->mLock IS locked
-
- Telemetry::HangHistogram& hang = ReportHang(mMaxTimeout);
- Telemetry::HangStack& stack = hang.GetNativeStack();
- if (stack.empty()) {
- mStackHelper.GetNativeStack(stack);
- }
}
MOZ_ALWAYS_INLINE void
@@ -493,7 +413,6 @@ BackgroundHangThread::Update()
mManager->Wakeup();
} else {
PRIntervalTime duration = intervalNow - mInterval;
- mStats.mActivity.Add(duration);
if (MOZ_UNLIKELY(duration >= mTimeout)) {
/* Wake up the manager thread to tell it that a hang ended */
mManager->Wakeup();
@@ -552,19 +471,12 @@ BackgroundHangMonitor::IsDisabled() {
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;
+ if (XRE_IsParentProcess()) {
+ BackgroundHangMonitor::Shutdown();
+ } else {
+ BackgroundHangManager::sDisabled = true;
}
-
- return false;
+ return true;
}
void
@@ -575,7 +487,6 @@ BackgroundHangMonitor::Startup()
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();
@@ -589,7 +500,6 @@ BackgroundHangMonitor::Startup()
}
}
- ThreadStackHelper::Startup();
BackgroundHangThread::Startup();
BackgroundHangManager::sInstance = new BackgroundHangManager();
#endif
@@ -610,7 +520,6 @@ BackgroundHangMonitor::Shutdown()
we don't want to hold the lock when it's being destroyed. */
BackgroundHangManager::sInstance->Shutdown();
BackgroundHangManager::sInstance = nullptr;
- ThreadStackHelper::Shutdown();
BackgroundHangManager::sDisabled = true;
#endif
}
@@ -652,11 +561,8 @@ BackgroundHangMonitor::NotifyActivity()
"This thread is not initialized for hang monitoring");
return;
}
-
- if (Telemetry::CanRecordExtended()) {
- mThread->NotifyActivity();
- }
#endif
+// STUB
}
void
@@ -668,11 +574,8 @@ BackgroundHangMonitor::NotifyWait()
"This thread is not initialized for hang monitoring");
return;
}
-
- if (Telemetry::CanRecordExtended()) {
- mThread->NotifyWait();
- }
#endif
+// STUB
}
bool
@@ -719,15 +622,4 @@ BackgroundHangMonitor::ThreadHangStatsIterator::ThreadHangStatsIterator()
#endif
}
-Telemetry::ThreadHangStats*
-BackgroundHangMonitor::ThreadHangStatsIterator::GetNext()
-{
- if (!mThread) {
- return nullptr;
- }
- Telemetry::ThreadHangStats* stats = &mThread->mStats;
- mThread = mThread->getNext();
- return stats;
-}
-
} // namespace mozilla