Index: runtime/vm/profiler.cc |
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc |
index 1b589d91a2c924f9a386d2a587a294ca09ad9e36..b19df91d4651da308c42e66ef9f1477bb88214f5 100644 |
--- a/runtime/vm/profiler.cc |
+++ b/runtime/vm/profiler.cc |
@@ -307,6 +307,12 @@ bool SampleFilter::TimeFilterSample(Sample* sample) { |
} |
+bool SampleFilter::TaskFilterSample(Sample* sample) { |
+ const intptr_t task = static_cast<intptr_t>(sample->thread_task()); |
+ return (task & thread_task_mask_) != 0; |
+} |
+ |
+ |
ClearProfileVisitor::ClearProfileVisitor(Isolate* isolate) |
: SampleVisitor(isolate) { |
} |
@@ -844,10 +850,7 @@ static Sample* SetupSample(Thread* thread, |
#endif |
sample->set_vm_tag(vm_tag); |
sample->set_user_tag(isolate->user_tag()); |
- // TODO(rmacnak): Consider tracking the current Task kind so the profiler |
- // can say the program spent x% of cpu time in the main thread, GC, |
- // background compilation, etc. |
- sample->set_is_mutator_thread(thread->IsMutatorThread()); |
+ sample->set_thread_task(thread->task_kind()); |
return sample; |
} |
@@ -989,6 +992,11 @@ void Profiler::SampleThread(Thread* thread, |
return; |
} |
+ // Thread is not doing VM work. |
+ if (thread->task_kind() == Thread::kUnknownTask) { |
+ return; |
+ } |
+ |
uword stack_lower = 0; |
uword stack_upper = 0; |
if (!GetAndValidateIsolateStackBounds(thread, |
@@ -1223,6 +1231,10 @@ ProcessedSampleBuffer* SampleBuffer::BuildProcessedSampleBuffer( |
// Did not pass time filter. |
continue; |
} |
+ if (!filter->TaskFilterSample(sample)) { |
+ // Did not pass task filter. |
+ continue; |
+ } |
if (!filter->FilterSample(sample)) { |
// Did not pass filter. |
continue; |