summaryrefslogtreecommitdiff
path: root/Source/WebKit2/Shared/linux
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/Shared/linux')
-rw-r--r--Source/WebKit2/Shared/linux/WebMemorySamplerLinux.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/Source/WebKit2/Shared/linux/WebMemorySamplerLinux.cpp b/Source/WebKit2/Shared/linux/WebMemorySamplerLinux.cpp
new file mode 100644
index 000000000..40c5e3946
--- /dev/null
+++ b/Source/WebKit2/Shared/linux/WebMemorySamplerLinux.cpp
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * 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.
+ */
+
+#include "config.h"
+#include "WebMemorySampler.h"
+
+#if ENABLE(MEMORY_SAMPLER)
+
+#include <JavaScriptCore/MemoryStatistics.h>
+#include <WebCore/CommonVM.h>
+#include <WebCore/CurrentProcessMemoryStatus.h>
+#include <WebCore/JSDOMWindow.h>
+#include <WebCore/NotImplemented.h>
+#include <runtime/JSCInlines.h>
+#include <runtime/JSLock.h>
+#include <string.h>
+#include <sys/sysinfo.h>
+#include <wtf/CurrentTime.h>
+#include <wtf/text/WTFString.h>
+
+using namespace WebCore;
+using namespace JSC;
+using namespace WTF;
+
+namespace WebKit {
+
+static const unsigned int maxBuffer = 128;
+static const unsigned int maxProcessPath = 35;
+
+static inline String nextToken(FILE* file)
+{
+ ASSERT(file);
+ if (!file)
+ return String();
+
+ char buffer[maxBuffer] = {0, };
+ unsigned int index = 0;
+ while (index < maxBuffer) {
+ int ch = fgetc(file);
+ if (ch == EOF || (isASCIISpace(ch) && index)) // Break on non-initial ASCII space.
+ break;
+ if (!isASCIISpace(ch)) {
+ buffer[index] = ch;
+ index++;
+ }
+ }
+
+ return String(buffer);
+}
+
+static inline void appendKeyValuePair(WebMemoryStatistics& stats, const String& key, size_t value)
+{
+ stats.keys.append(key);
+ stats.values.append(value);
+}
+
+String WebMemorySampler::processName() const
+{
+ char processPath[maxProcessPath];
+ snprintf(processPath, maxProcessPath, "/proc/self/status");
+ FILE* statusFileDescriptor = fopen(processPath, "r");
+ if (!statusFileDescriptor)
+ return String();
+
+ nextToken(statusFileDescriptor);
+ String processName = nextToken(statusFileDescriptor);
+
+ fclose(statusFileDescriptor);
+
+ return processName;
+}
+
+WebMemoryStatistics WebMemorySampler::sampleWebKit() const
+{
+ WebMemoryStatistics webKitMemoryStats;
+
+ double now = currentTime();
+
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Timestamp"), now);
+
+ ProcessMemoryStatus processMemoryStatus;
+ currentProcessMemoryStatus(processMemoryStatus);
+
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Total Program Bytes"), processMemoryStatus.size);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Resident Set Bytes"), processMemoryStatus.resident);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Resident Shared Bytes"), processMemoryStatus.shared);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Text Bytes"), processMemoryStatus.text);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Library Bytes"), processMemoryStatus.lib);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Data + Stack Bytes"), processMemoryStatus.data);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Dirty Bytes"), processMemoryStatus.dt);
+
+ size_t totalBytesInUse = 0;
+ size_t totalBytesCommitted = 0;
+
+ FastMallocStatistics fastMallocStatistics = WTF::fastMallocStatistics();
+ size_t fastMallocBytesInUse = fastMallocStatistics.committedVMBytes - fastMallocStatistics.freeListBytes;
+ size_t fastMallocBytesCommitted = fastMallocStatistics.committedVMBytes;
+ totalBytesInUse += fastMallocBytesInUse;
+ totalBytesCommitted += fastMallocBytesCommitted;
+
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Fast Malloc In Use"), fastMallocBytesInUse);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Fast Malloc Committed Memory"), fastMallocBytesCommitted);
+
+ size_t jscHeapBytesInUse = commonVM().heap.size();
+ size_t jscHeapBytesCommitted = commonVM().heap.capacity();
+ totalBytesInUse += jscHeapBytesInUse;
+ totalBytesCommitted += jscHeapBytesCommitted;
+
+ GlobalMemoryStatistics globalMemoryStats = globalMemoryStatistics();
+ totalBytesInUse += globalMemoryStats.stackBytes + globalMemoryStats.JITBytes;
+ totalBytesCommitted += globalMemoryStats.stackBytes + globalMemoryStats.JITBytes;
+
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("JavaScript Heap In Use"), jscHeapBytesInUse);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("JavaScript Heap Committed Memory"), jscHeapBytesCommitted);
+
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("JavaScript Stack Bytes"), globalMemoryStats.stackBytes);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("JavaScript JIT Bytes"), globalMemoryStats.JITBytes);
+
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Total Memory In Use"), totalBytesInUse);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Total Committed Memory"), totalBytesCommitted);
+
+ struct sysinfo systemInfo;
+ if (!sysinfo(&systemInfo)) {
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("System Total Bytes"), systemInfo.totalram);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Available Bytes"), systemInfo.freeram);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Shared Bytes"), systemInfo.sharedram);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Buffer Bytes"), systemInfo.bufferram);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Total Swap Bytes"), systemInfo.totalswap);
+ appendKeyValuePair(webKitMemoryStats, ASCIILiteral("Available Swap Bytes"), systemInfo.freeswap);
+ }
+
+ return webKitMemoryStats;
+}
+
+void WebMemorySampler::sendMemoryPressureEvent()
+{
+ notImplemented();
+}
+
+}
+#endif