| /* |
| * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 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. AND ITS CONTRIBUTORS ``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 ITS 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. |
| * |
| * The MemorySampler class samples a number of internal and external memory |
| * metrics every second while running. Sample data is written to a log file. |
| * Sampling occurs over a duration specified when started. If duration is set |
| * to 0 (default), the memory sampler will run indefinitely until the stop |
| * function is called. MemorySampler allows the option of sampling "in use" |
| * memory (committed memory minus free list byte count) or committed memory for |
| * any allocator which keeps a free list. This includes FastMalloc and the |
| * JavaScriptCore heap at this time. |
| * The following memory metrics are recorded: |
| * |
| * WebCore |
| * - FastMalloc allocations bytes (in use or committed) |
| * JavaScriptCore |
| * - Garbage collector heap bytes (in use or committed) |
| * - Stack bytes (committed only!) |
| * - JIT Code bytes (committed only!) |
| * Malloc zones |
| * - In use bytes for the following zones: |
| * * Default zone (in use or committed) |
| * * DispCon zone (in use or committed) |
| * * Purgable zone (in use or committed) |
| * Task Info |
| * - Resident size memory (RSIZE) |
| */ |
| |
| #ifndef WebMemorySampler_h |
| #define WebMemorySampler_h |
| |
| #if ENABLE(MEMORY_SAMPLER) |
| |
| #include "SandboxExtension.h" |
| #include <WebCore/Timer.h> |
| #include <WebCore/FileSystem.h> |
| #include <wtf/Noncopyable.h> |
| #include <wtf/RefPtr.h> |
| #include <wtf/text/WTFString.h> |
| #include <wtf/Vector.h> |
| |
| namespace WebKit { |
| |
| struct SystemMallocStats; |
| |
| struct WebMemoryStatistics |
| { |
| Vector<String> keys; |
| Vector<size_t> values; |
| }; |
| |
| class WebMemorySampler { |
| WTF_MAKE_NONCOPYABLE(WebMemorySampler); |
| public: |
| static WebMemorySampler* shared(); |
| void start(const double interval=0); |
| void start(const SandboxExtension::Handle&, const String&, const double interval=0); |
| void stop(); |
| bool isRunning() const; |
| |
| private: |
| WebMemorySampler(); |
| ~WebMemorySampler(); |
| |
| void initializeTempLogFile(); |
| void initializeSandboxedLogFile(const SandboxExtension::Handle&, const String&); |
| void writeHeaders(); |
| void initializeTimers(double); |
| void sampleTimerFired(WebCore::Timer<WebMemorySampler>*); |
| void stopTimerFired(WebCore::Timer<WebMemorySampler>*); |
| void appendCurrentMemoryUsageToFile(WebCore::PlatformFileHandle&); |
| |
| SystemMallocStats sampleSystemMalloc() const; |
| size_t sampleProcessCommittedBytes() const; |
| WebMemoryStatistics sampleWebKit() const; |
| String processName() const; |
| |
| WebCore::PlatformFileHandle m_sampleLogFile; |
| String m_sampleLogFilePath; |
| String m_separator; |
| WebCore::Timer<WebMemorySampler> m_sampleTimer; |
| WebCore::Timer<WebMemorySampler> m_stopTimer; |
| bool m_isRunning; |
| double m_runningTime; |
| RefPtr<SandboxExtension> m_sampleLogSandboxExtension; |
| }; |
| |
| } |
| |
| #endif |
| |
| #endif |