[heap] Emit trace event for background GC tasks.

The following events in v8.gc category are emitted:
- V8.GC_BACKGROUND_ARRAY_BUFFER_FREE
- V8.GC_BACKGROUND_STORE_BUFFER
- V8.GC_BACKGROUND_UNMAPPER
- V8.GC_MC_BACKGROUND_EVACUATE_COPY
- V8.GC_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS
- V8.GC_MC_BACKGROUND_MARKING
- V8.GC_MC_BACKGROUND_SWEEPING
- V8.GC_MINOR_MC_BACKGROUND_EVACUATE_COPY
- V8.GC_MINOR_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS
- V8.GC_MINOR_MC_BACKGROUND_MARKING
- V8.GC_SCAVENGER_BACKGROUND_SCAVENGE_PARALLEL

Bug: chromium:758183
Change-Id: I04368f75ac740cbc832a864609709e5a46f5baef
Reviewed-on: https://chromium-review.googlesource.com/825203
Commit-Queue: Ulan Degenbaev <ulan@chromium.org>
Reviewed-by: Hannes Payer <hpayer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#50107}
This commit is contained in:
Ulan Degenbaev 2017-12-14 12:41:10 +01:00 committed by Commit Bot
parent 8e85145345
commit 2031503a3b
9 changed files with 39 additions and 19 deletions

View File

@ -36,7 +36,7 @@ class ArrayBufferCollector::FreeingTask final : public CancelableTask {
private:
void RunInternal() final {
GCTracer::BackgroundScope scope(
TRACE_BACKGROUND_GC(
heap_->tracer(),
GCTracer::BackgroundScope::BACKGROUND_ARRAY_BUFFER_FREE);
heap_->array_buffer_collector()->FreeAllocations();

View File

@ -439,8 +439,8 @@ ConcurrentMarking::ConcurrentMarking(Heap* heap, MarkingWorklist* shared,
}
void ConcurrentMarking::Run(int task_id, TaskState* task_state) {
GCTracer::BackgroundScope scope(
heap_->tracer(), GCTracer::BackgroundScope::MC_BACKGROUND_MARKING);
TRACE_BACKGROUND_GC(heap_->tracer(),
GCTracer::BackgroundScope::MC_BACKGROUND_MARKING);
size_t kBytesUntilInterruptCheck = 64 * KB;
int kObjectsUntilInterrupCheck = 1000;
LiveBytesMap* live_bytes = nullptr;

View File

@ -80,7 +80,22 @@ const char* GCTracer::Scope::Name(ScopeId id) {
break;
}
#undef CASE
return "(unknown)";
UNREACHABLE();
return nullptr;
}
const char* GCTracer::BackgroundScope::Name(ScopeId id) {
#define CASE(scope) \
case BackgroundScope::scope: \
return "V8.GC_" #scope;
switch (id) {
TRACER_BACKGROUND_SCOPES(CASE)
case BackgroundScope::NUMBER_OF_SCOPES:
break;
}
#undef CASE
UNREACHABLE();
return nullptr;
}
GCTracer::Event::Event(Type type, GarbageCollectionReason gc_reason,

View File

@ -31,6 +31,11 @@ enum ScavengeSpeedMode { kForAllObjects, kForSurvivedObjects };
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.gc"), \
GCTracer::Scope::Name(gc_tracer_scope_id))
#define TRACE_BACKGROUND_GC(tracer, scope_id) \
GCTracer::BackgroundScope background_scope(tracer, scope_id); \
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.gc"), \
GCTracer::BackgroundScope::Name(scope_id))
// GCTracer collects and prints ONE line after each garbage collector
// invocation IFF --trace_gc is used.
class V8_EXPORT_PRIVATE GCTracer {
@ -109,6 +114,8 @@ class V8_EXPORT_PRIVATE GCTracer {
BackgroundScope(GCTracer* tracer, ScopeId scope);
~BackgroundScope();
static const char* Name(ScopeId id);
private:
GCTracer* tracer_;
ScopeId scope_;

View File

@ -1920,7 +1920,7 @@ class ScavengingTask final : public ItemParallelJob::Task {
barrier_(barrier) {}
void RunInParallel() final {
GCTracer::BackgroundScope scope(
TRACE_BACKGROUND_GC(
heap_->tracer(),
GCTracer::BackgroundScope::SCAVENGER_BACKGROUND_SCAVENGE_PARALLEL);
double scavenging_time = 0.0;

View File

@ -1853,9 +1853,8 @@ class YoungGenerationMarkingTask : public ItemParallelJob::Task {
}
void RunInParallel() override {
GCTracer::BackgroundScope scope(
collector_->heap()->tracer(),
GCTracer::BackgroundScope::MINOR_MC_BACKGROUND_MARKING);
TRACE_BACKGROUND_GC(collector_->heap()->tracer(),
GCTracer::BackgroundScope::MINOR_MC_BACKGROUND_MARKING);
double marking_time = 0.0;
{
TimedScope scope(&marking_time);
@ -3244,8 +3243,7 @@ class PageEvacuationTask : public ItemParallelJob::Task {
tracer_(isolate->heap()->tracer()) {}
void RunInParallel() override {
GCTracer::BackgroundScope scope(tracer_,
evacuator_->GetBackgroundTracingScope());
TRACE_BACKGROUND_GC(tracer_, evacuator_->GetBackgroundTracingScope());
PageEvacuationItem* item = nullptr;
while ((item = GetItem<PageEvacuationItem>()) != nullptr) {
evacuator_->EvacuatePage(item->page());
@ -3561,7 +3559,7 @@ class PointersUpdatingTask : public ItemParallelJob::Task {
scope_(scope) {}
void RunInParallel() override {
GCTracer::BackgroundScope scope(tracer_, scope_);
TRACE_BACKGROUND_GC(tracer_, scope_);
UpdatingItem* item = nullptr;
while ((item = GetItem<UpdatingItem>()) != nullptr) {
item->Process();

View File

@ -320,8 +320,8 @@ class MemoryAllocator::Unmapper::UnmapFreeMemoryTask : public CancelableTask {
private:
void RunInternal() override {
GCTracer::BackgroundScope scope(
tracer_, GCTracer::BackgroundScope::BACKGROUND_UNMAPPER);
TRACE_BACKGROUND_GC(tracer_,
GCTracer::BackgroundScope::BACKGROUND_UNMAPPER);
unmapper_->PerformFreeMemoryOnQueuedChunks<FreeMode::kUncommitPooled>();
unmapper_->pending_unmapping_tasks_semaphore_.Signal();
}

View File

@ -175,8 +175,8 @@ class StoreBuffer {
private:
void RunInternal() override {
GCTracer::BackgroundScope scope(
tracer_, GCTracer::BackgroundScope::BACKGROUND_STORE_BUFFER);
TRACE_BACKGROUND_GC(tracer_,
GCTracer::BackgroundScope::BACKGROUND_STORE_BUFFER);
store_buffer_->ConcurrentlyProcessStoreBuffer();
}
StoreBuffer* store_buffer_;

View File

@ -76,8 +76,8 @@ class Sweeper::SweeperTask final : public CancelableTask {
private:
void RunInternal() final {
GCTracer::BackgroundScope scope(
tracer_, GCTracer::BackgroundScope::MC_BACKGROUND_SWEEPING);
TRACE_BACKGROUND_GC(tracer_,
GCTracer::BackgroundScope::MC_BACKGROUND_SWEEPING);
DCHECK_GE(space_to_start_, FIRST_PAGED_SPACE);
DCHECK_LE(space_to_start_, LAST_PAGED_SPACE);
const int offset = space_to_start_ - FIRST_PAGED_SPACE;
@ -529,8 +529,8 @@ class Sweeper::IterabilityTask final : public CancelableTask {
private:
void RunInternal() final {
GCTracer::BackgroundScope scope(
tracer_, GCTracer::BackgroundScope::MC_BACKGROUND_SWEEPING);
TRACE_BACKGROUND_GC(tracer_,
GCTracer::BackgroundScope::MC_BACKGROUND_SWEEPING);
for (Page* page : sweeper_->iterability_list_) {
sweeper_->MakeIterable(page);
}