Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (245498 => 245499)
--- trunk/Source/_javascript_Core/ChangeLog 2019-05-18 05:27:06 UTC (rev 245498)
+++ trunk/Source/_javascript_Core/ChangeLog 2019-05-18 07:12:17 UTC (rev 245499)
@@ -1,3 +1,19 @@
+2019-05-18 Tadeu Zagallo <[email protected]>
+
+ Add extra information to dumpJITMemory
+ https://bugs.webkit.org/show_bug.cgi?id=197998
+
+ Reviewed by Saam Barati.
+
+ Add ktrace events around the memory dump and mach_absolute_time to link the
+ events with the entries in the dump. Additionally, add a background queue
+ to flush on a configurable interval, since the atexit callback does not work
+ in every situation.
+
+ * jit/ExecutableAllocator.cpp:
+ (JSC::dumpJITMemory):
+ * runtime/Options.h:
+
2019-05-17 Justin Michaud <[email protected]>
[WASM-References] Add support for Anyref in parameters and return types, Ref.null and Ref.is_null for Anyref values.
Modified: trunk/Source/_javascript_Core/jit/ExecutableAllocator.cpp (245498 => 245499)
--- trunk/Source/_javascript_Core/jit/ExecutableAllocator.cpp 2019-05-18 05:27:06 UTC (rev 245498)
+++ trunk/Source/_javascript_Core/jit/ExecutableAllocator.cpp 2019-05-18 07:12:17 UTC (rev 245499)
@@ -33,8 +33,11 @@
#include "JSCInlines.h"
#include <wtf/MetaAllocator.h>
#include <wtf/PageReservation.h>
+#include <wtf/SystemTracing.h>
+#include <wtf/WorkQueue.h>
#if OS(DARWIN)
+#include <mach/mach_time.h>
#include <sys/mman.h>
#endif
@@ -559,7 +562,9 @@
static uint8_t* buffer;
static constexpr size_t bufferSize = fixedExecutableMemoryPoolSize;
static size_t offset = 0;
- static auto flush = [] {
+ static Lock dumpJITMemoryLock;
+ static bool needsToFlush = false;
+ static auto flush = [](const AbstractLocker&) {
if (fd == -1) {
fd = open(Options::dumpJITMemoryPath(), O_CREAT | O_TRUNC | O_APPEND | O_WRONLY | O_EXLOCK | O_NONBLOCK, 0666);
RELEASE_ASSERT(fd != -1);
@@ -566,32 +571,52 @@
}
write(fd, buffer, offset);
offset = 0;
+ needsToFlush = false;
};
- static Lock dumpJITMemoryLock;
static std::once_flag once;
+ static LazyNeverDestroyed<Ref<WorkQueue>> flushQueue;
std::call_once(once, [] {
buffer = bitwise_cast<uint8_t*>(malloc(bufferSize));
+ flushQueue.construct(WorkQueue::create("jsc.dumpJITMemory.queue", WorkQueue::Type::Serial, WorkQueue::QOS::Background));
std::atexit([] {
LockHolder locker(dumpJITMemoryLock);
- flush();
+ flush(locker);
close(fd);
+ fd = -1;
});
});
- static auto write = [](const void* src, size_t size) {
+ static auto enqueueFlush = [](const AbstractLocker&) {
+ if (needsToFlush)
+ return;
+
+ needsToFlush = true;
+ flushQueue.get()->dispatchAfter(Seconds(Options::dumpJITMemoryFlushInterval()), [] {
+ LockHolder locker(dumpJITMemoryLock);
+ if (!needsToFlush)
+ return;
+ flush(locker);
+ });
+ };
+
+ static auto write = [](const AbstractLocker& locker, const void* src, size_t size) {
if (UNLIKELY(offset + size > bufferSize))
- flush();
+ flush(locker);
memcpy(buffer + offset, src, size);
offset += size;
+ enqueueFlush(locker);
};
LockHolder locker(dumpJITMemoryLock);
+ uint64_t time = mach_absolute_time();
uint64_t dst64 = bitwise_cast<uintptr_t>(dst);
- write(&dst64, sizeof(dst64));
uint64_t size64 = size;
- write(&size64, sizeof(size64));
- write(src, size);
+ TraceScope(DumpJITMemoryStart, DumpJITMemoryStop, time, dst64, size64);
+ write(locker, &time, sizeof(time));
+ write(locker, &dst64, sizeof(dst64));
+ write(locker, &size64, sizeof(size64));
+ write(locker, src, size);
#else
UNUSED_PARAM(dst);
UNUSED_PARAM(src);
Modified: trunk/Source/_javascript_Core/runtime/Options.h (245498 => 245499)
--- trunk/Source/_javascript_Core/runtime/Options.h 2019-05-18 05:27:06 UTC (rev 245498)
+++ trunk/Source/_javascript_Core/runtime/Options.h 2019-05-18 07:12:17 UTC (rev 245499)
@@ -519,6 +519,7 @@
v(bool, validateAbstractInterpreterState, false, Restricted, nullptr) \
v(double, validateAbstractInterpreterStateProbability, 0.5, Normal, nullptr) \
v(optionString, dumpJITMemoryPath, nullptr, Restricted, nullptr) \
+ v(double, dumpJITMemoryFlushInterval, 10, Restricted, "Maximum time in between flushes of the JIT memory dump in seconds.") \
enum OptionEquivalence {
Modified: trunk/Source/WTF/ChangeLog (245498 => 245499)
--- trunk/Source/WTF/ChangeLog 2019-05-18 05:27:06 UTC (rev 245498)
+++ trunk/Source/WTF/ChangeLog 2019-05-18 07:12:17 UTC (rev 245499)
@@ -1,3 +1,14 @@
+2019-05-18 Tadeu Zagallo <[email protected]>
+
+ Add extra information to dumpJITMemory
+ https://bugs.webkit.org/show_bug.cgi?id=197998
+
+ Reviewed by Saam Barati.
+
+ Add a new trace point code for JSC::dumpJITMemory
+
+ * wtf/SystemTracing.h:
+
2019-05-17 Don Olmstead <[email protected]>
[CMake] Use builtin FindICU
Modified: trunk/Source/WTF/wtf/SystemTracing.h (245498 => 245499)
--- trunk/Source/WTF/wtf/SystemTracing.h 2019-05-18 05:27:06 UTC (rev 245498)
+++ trunk/Source/WTF/wtf/SystemTracing.h 2019-05-18 07:12:17 UTC (rev 245499)
@@ -47,6 +47,8 @@
WebAssemblyCompileEnd,
WebAssemblyExecuteStart,
WebAssemblyExecuteEnd,
+ DumpJITMemoryStart,
+ DumpJITMemoryStop,
WebCoreRange = 5000,
MainResourceLoadDidStartProvisional,
Modified: trunk/Tools/ChangeLog (245498 => 245499)
--- trunk/Tools/ChangeLog 2019-05-18 05:27:06 UTC (rev 245498)
+++ trunk/Tools/ChangeLog 2019-05-18 07:12:17 UTC (rev 245499)
@@ -1,3 +1,14 @@
+2019-05-18 Tadeu Zagallo <[email protected]>
+
+ Add extra information to dumpJITMemory
+ https://bugs.webkit.org/show_bug.cgi?id=197998
+
+ Reviewed by Saam Barati.
+
+ Add description for the new dumpJITMemory trace point code.
+
+ * Tracing/SystemTracePoints.plist:
+
2019-05-17 Justin Michaud <[email protected]>
[WASM-References] Add support for Anyref in parameters and return types, Ref.null and Ref.is_null for Anyref values.
Modified: trunk/Tools/Tracing/SystemTracePoints.plist (245498 => 245499)
--- trunk/Tools/Tracing/SystemTracePoints.plist 2019-05-18 05:27:06 UTC (rev 245498)
+++ trunk/Tools/Tracing/SystemTracePoints.plist 2019-05-18 07:12:17 UTC (rev 245499)
@@ -45,6 +45,18 @@
</dict>
<dict>
<key>Name</key>
+ <string>Dump JIT Memory</string>
+ <key>Type</key>
+ <string>Interval</string>
+ <key>Component</key>
+ <string>47</string>
+ <key>CodeBegin</key>
+ <string>2507</string>
+ <key>CodeEnd</key>
+ <string>2508</string>
+ </dict>
+ <dict>
+ <key>Name</key>
<string>Main Resource Load</string>
<key>Type</key>
<string>Interval</string>