diff -r 000000000000 -r 6474c204b198 xpcom/threads/ThreadStackHelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xpcom/threads/ThreadStackHelper.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_ThreadStackHelper_h +#define mozilla_ThreadStackHelper_h + +#include "mozilla/ThreadHangStats.h" + +#include "GeckoProfiler.h" + +#include + +#if defined(XP_LINUX) +#include +#include +#include +#elif defined(XP_WIN) +#include +#elif defined(XP_MACOSX) +#include +#endif + +namespace mozilla { + +/** + * ThreadStackHelper is used to retrieve the profiler pseudo-stack of a + * thread, as an alternative of using the profiler to take a profile. + * The target thread first declares an ThreadStackHelper instance; + * then another thread can call ThreadStackHelper::GetStack to retrieve + * the pseudo-stack of the target thread at that instant. + * + * Only non-copying labels are included in the stack, which means labels + * with custom text and markers are not included. + */ +class ThreadStackHelper +{ +public: + typedef Telemetry::HangHistogram::Stack Stack; + +private: +#ifdef MOZ_ENABLE_PROFILER_SPS + const PseudoStack* const mPseudoStack; +#endif + Stack mStackBuffer; + size_t mMaxStackSize; + + bool PrepareStackBuffer(Stack& aStack); + void FillStackBuffer(); + +public: + /** + * Initialize ThreadStackHelper. Must be called from main thread. + */ + static void Startup(); + /** + * Uninitialize ThreadStackHelper. Must be called from main thread. + */ + static void Shutdown(); + + /** + * Create a ThreadStackHelper instance targeting the current thread. + */ + ThreadStackHelper(); + + ~ThreadStackHelper(); + + /** + * Retrieve the current pseudostack of the thread associated + * with this ThreadStackHelper. + * + * @param aStack Stack instance to be filled. + */ + void GetStack(Stack& aStack); + +#if defined(XP_LINUX) +private: + static int sInitialized; + static sem_t sSem; + static struct sigaction sOldSigAction; + static ThreadStackHelper* sCurrent; + + static void SigAction(int aSignal, siginfo_t* aInfo, void* aContext); + + pid_t mThreadID; + +#elif defined(XP_WIN) +private: + bool mInitialized; + HANDLE mThreadID; + +#elif defined(XP_MACOSX) +private: + thread_act_t mThreadID; + +#endif +}; + +} // namespace mozilla + +#endif // mozilla_ThreadStackHelper_h