diff options
Diffstat (limited to 'Source/WTF/wtf/StackStats.h')
-rw-r--r-- | Source/WTF/wtf/StackStats.h | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/Source/WTF/wtf/StackStats.h b/Source/WTF/wtf/StackStats.h new file mode 100644 index 000000000..263567974 --- /dev/null +++ b/Source/WTF/wtf/StackStats.h @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef StackStats_h +#define StackStats_h + +#include "ExportMacros.h" +#include "ThreadingPrimitives.h" + + +// Define this flag to enable Stack stats collection. This feature is useful +// for getting a sample of native stack usage sizes. +// +// Enabling this will cause stats to be collected and written to a log file at +// various instrumented points in the code. It will result in noticeable +// performance loss. Hence, this should only be enable when you want to do +// some stats location in your local build. This code is provided here as a +// convenience for collecting that data. It is not meant to be enabled by +// default on release or debug builds. + +// #define ENABLE_STACK_STATS 1 + + +namespace WTF { + +#if !ENABLE(STACK_STATS) + +class StackStats { +public: + // The CheckPoint class is for marking check points corresponding + // each location in code where a stack recursion check is being done. + + class CheckPoint { + public: + CheckPoint() { } + }; + + class PerThreadStats { + public: + PerThreadStats() { } + }; + + class LayoutCheckPoint { + public: + LayoutCheckPoint() { } + }; + + static void initialize() { } + static void probe() { } +}; + +#else // ENABLE(STACK_STATS) + +class StackStats { +public: + // The CheckPoint class is for marking check points corresponding + // each location in code where a stack recursion check is being done. + + class CheckPoint { + public: + CheckPoint(); + ~CheckPoint(); + private: + CheckPoint* m_prev; + }; + + class PerThreadStats { + public: + PerThreadStats(); + + private: + int m_reentryDepth; + char* m_stackStart; + CheckPoint* m_currentCheckPoint; + + friend class CheckPoint; + friend class StackStats; + }; + + class LayoutCheckPoint { + public: + WTF_EXPORT_PRIVATE LayoutCheckPoint(); + WTF_EXPORT_PRIVATE ~LayoutCheckPoint(); + + private: + LayoutCheckPoint* m_prev; + int m_depth; + }; + + // Initializes locks and the log file. Should only be called once. + static void initialize(); + + // Used for probing the stack at places where we suspect to be high + // points of stack usage but are NOT check points where stack recursion + // is checked. + // + // The more places where we add this probe, the more accurate our + // stats data will be. However, adding too many probes will also + // result in unnecessary performance loss. So, only add these probes + // judiciously where appropriate. + static void probe(); + +private: + // CheckPoint management: + static Mutex* s_sharedLock; + static CheckPoint* s_topCheckPoint; + static LayoutCheckPoint* s_firstLayoutCheckPoint; + static LayoutCheckPoint* s_topLayoutCheckPoint; + + // High watermark stats: + static int s_maxCheckPointDiff; + static int s_maxStackHeight; + static int s_maxReentryDepth; + + static int s_maxLayoutCheckPointDiff; + static int s_maxTotalLayoutCheckPointDiff; + static int s_maxLayoutReentryDepth; + + friend class CheckPoint; + friend class LayoutCheckPoint; +}; + +#endif // ENABLE(STACK_STATS) + +} // namespace WTF + +using WTF::StackStats; + +#endif // StackStats_h |