Index: runtime/vm/profiler.cc |
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc |
index 7110d082ae276e80ebd9b09549448502da39d0ee..e069e36f5c54320288d67c2a2e71224cf8270dfc 100644 |
--- a/runtime/vm/profiler.cc |
+++ b/runtime/vm/profiler.cc |
@@ -316,6 +316,9 @@ bool SampleFilter::TimeFilterSample(Sample* sample) { |
bool SampleFilter::TaskFilterSample(Sample* sample) { |
const intptr_t task = static_cast<intptr_t>(sample->thread_task()); |
+ if (thread_task_mask_ == kNoTaskFilter) { |
+ return true; |
+ } |
return (task & thread_task_mask_) != 0; |
} |
@@ -938,12 +941,11 @@ static Sample* SetupSampleNative(SampleBuffer* sample_buffer, ThreadId tid) { |
Sample* sample = sample_buffer->ReserveSample(); |
sample->Init(ILLEGAL_PORT, OS::GetCurrentMonotonicMicros(), tid); |
sample->set_is_native_allocation_sample(true); |
- |
Thread* thread = Thread::Current(); |
- // TODO(bkonyi) Any samples created while a current thread doesn't exist are |
- // ignored by the NativeAllocationSampleFilter since the default task is |
- // kUnknownTask. Is this what we want to do? |
+ // Note: setting thread task in order to be consistent with other samples. The |
+ // task kind is not used by NativeAllocationSampleFilter for filtering |
+ // purposes as some samples may be collected when no thread exists. |
if (thread != NULL) { |
sample->set_thread_task(thread->task_kind()); |
} |
@@ -1092,7 +1094,9 @@ void Profiler::SampleAllocation(Thread* thread, intptr_t cid) { |
} |
-Sample* Profiler::SampleNativeAllocation(intptr_t skip_count) { |
+Sample* Profiler::SampleNativeAllocation(intptr_t skip_count, |
+ uword address, |
+ uintptr_t allocation_size) { |
SampleBuffer* sample_buffer = Profiler::sample_buffer(); |
if (sample_buffer == NULL) { |
return NULL; |
@@ -1122,9 +1126,13 @@ Sample* Profiler::SampleNativeAllocation(intptr_t skip_count) { |
OSThread* os_thread = OSThread::Current(); |
Sample* sample = SetupSampleNative(sample_buffer, os_thread->trace_id()); |
+ sample->set_native_allocation_address(address); |
+ sample->set_native_allocation_size_bytes(allocation_size); |
+ |
ProfilerNativeStackWalker native_stack_walker( |
ILLEGAL_PORT, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp, |
skip_count); |
+ |
native_stack_walker.walk(); |
return sample; |
} |
@@ -1457,6 +1465,8 @@ ProcessedSample* SampleBuffer::BuildProcessedSample( |
ProcessedSample* processed_sample = new (zone) ProcessedSample(); |
// Copy state bits from sample. |
+ processed_sample->set_native_allocation_size_bytes( |
+ sample->native_allocation_size_bytes()); |
processed_sample->set_timestamp(sample->timestamp()); |
processed_sample->set_tid(sample->tid()); |
processed_sample->set_vm_tag(sample->vm_tag()); |