Chromium Code Reviews| Index: Source/platform/heap/ThreadState.cpp |
| diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp |
| index 9bf8d7f1126397c00bfae27bae7fca6b16671a87..0a51cf0c0f3062ef27ee23a7107bfde732a74161 100644 |
| --- a/Source/platform/heap/ThreadState.cpp |
| +++ b/Source/platform/heap/ThreadState.cpp |
| @@ -56,6 +56,10 @@ extern "C" void* __libc_stack_end; // NOLINT |
| #include <sanitizer/msan_interface.h> |
| #endif |
| +#if ENABLE(GC_PROFILING) |
| +#include <limits> |
| +#endif |
| + |
| #if OS(FREEBSD) |
| #include <pthread_np.h> |
| #endif |
| @@ -312,6 +316,9 @@ ThreadState::ThreadState() |
| #if defined(ADDRESS_SANITIZER) |
| , m_asanFakeStack(__asan_get_current_fake_stack()) |
| #endif |
| +#if ENABLE(GC_PROFILING) |
| + , m_nextFreeListSnapshotTime(-std::numeric_limits<double>::infinity()) |
| +#endif |
| { |
| checkThread(); |
| ASSERT(!**s_threadSpecific); |
| @@ -1088,6 +1095,10 @@ void ThreadState::postGCProcessing() |
| setGCState(Sweeping); |
| completeSweep(); |
| #endif |
| + |
| +#if ENABLE(GC_PROFILING) |
| + snapshotFreeListIfNecessary(); |
| +#endif |
| } |
| void ThreadState::addInterruptor(Interruptor* interruptor) |
| @@ -1166,6 +1177,45 @@ const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) |
| threadAttachMutex().unlock(); |
| return nullptr; |
| } |
| + |
| +void ThreadState::snapshotFreeListIfNecessary() |
| +{ |
| + bool enabled; |
| + TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink_gc"), &enabled); |
| + if (!enabled) |
| + return; |
| + |
| + static const double recordIntervalSeconds = 0.010; |
| + double now = monotonicallyIncreasingTime(); |
| + if (now > m_nextFreeListSnapshotTime) { |
| + snapshotFreeList(); |
| + m_nextFreeListSnapshotTime = now + recordIntervalSeconds; |
| + } |
| +} |
| + |
| +void ThreadState::snapshotFreeList() |
| +{ |
| + RefPtr<TracedValue> json = TracedValue::create(); |
| + |
| +#define SNAPSHOT_FREE_LIST(HeapType) \ |
| + { \ |
| + json->beginDictionary(); \ |
| + json->setString("name", #HeapType); \ |
| + m_heaps[HeapType##Heap]->snapshotFreeList(*json); \ |
| + json->endDictionary(); \ |
| + } |
| + |
| + json->beginArray("heaps"); |
| + SNAPSHOT_FREE_LIST(General); |
| + SNAPSHOT_FREE_LIST(VectorBacking); |
|
haraken
2015/02/04 07:30:01
Add SNAPSHOT_FREE_LIST(InlineVectorBacking).
Yuta Kitamura
2015/02/04 09:45:42
Done.
|
| + SNAPSHOT_FREE_LIST(HashTableBacking); |
| + FOR_EACH_TYPED_HEAP(SNAPSHOT_FREE_LIST); |
| + json->endArray(); |
| + |
| +#undef SNAPSHOT_FREE_LIST |
| + |
| + TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), "FreeList", this, json.release()); |
| +} |
| #endif |
| } // namespace blink |