Index: runtime/vm/profiler.h |
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h |
index ee87a31d954051b61af6a7a822b7f2bb78da23eb..9f967cf9bea02ca0b3b176a14616582e3f6a1d75 100644 |
--- a/runtime/vm/profiler.h |
+++ b/runtime/vm/profiler.h |
@@ -41,6 +41,8 @@ struct ProfilerCounters { |
int64_t stack_walker_dart_exit; |
int64_t stack_walker_dart; |
int64_t stack_walker_none; |
+ // Count of failed checks: |
+ int64_t failure_native_allocation_sample; |
}; |
@@ -58,6 +60,7 @@ class Profiler : public AllStatic { |
static void DumpStackTrace(); |
static void SampleAllocation(Thread* thread, intptr_t cid); |
+ static Sample* SampleNativeAllocation(intptr_t skip_count); |
// SampleThread is called from inside the signal handler and hence it is very |
// critical that the implementation of SampleThread does not do any of the |
@@ -91,7 +94,7 @@ class Profiler : public AllStatic { |
class SampleVisitor : public ValueObject { |
public: |
- explicit SampleVisitor(Isolate* isolate) : isolate_(isolate), visited_(0) {} |
+ explicit SampleVisitor(Dart_Port port) : port_(port), visited_(0) {} |
virtual ~SampleVisitor() {} |
virtual void VisitSample(Sample* sample) = 0; |
@@ -100,10 +103,10 @@ class SampleVisitor : public ValueObject { |
void IncrementVisited() { visited_++; } |
- Isolate* isolate() const { return isolate_; } |
+ Dart_Port port() const { return port_; } |
private: |
- Isolate* isolate_; |
+ Dart_Port port_; |
intptr_t visited_; |
DISALLOW_IMPLICIT_CONSTRUCTORS(SampleVisitor); |
@@ -112,11 +115,11 @@ class SampleVisitor : public ValueObject { |
class SampleFilter : public ValueObject { |
public: |
- SampleFilter(Isolate* isolate, |
+ SampleFilter(Dart_Port port, |
intptr_t thread_task_mask, |
int64_t time_origin_micros, |
int64_t time_extent_micros) |
- : isolate_(isolate), |
+ : port_(port), |
thread_task_mask_(thread_task_mask), |
time_origin_micros_(time_origin_micros), |
time_extent_micros_(time_extent_micros) { |
@@ -130,7 +133,7 @@ class SampleFilter : public ValueObject { |
// Return |true| if |sample| passes the filter. |
virtual bool FilterSample(Sample* sample) { return true; } |
- Isolate* isolate() const { return isolate_; } |
+ Dart_Port port() const { return port_; } |
// Returns |true| if |sample| passes the time filter. |
bool TimeFilterSample(Sample* sample); |
@@ -139,7 +142,7 @@ class SampleFilter : public ValueObject { |
bool TaskFilterSample(Sample* sample); |
private: |
- Isolate* isolate_; |
+ Dart_Port port_; |
intptr_t thread_task_mask_; |
int64_t time_origin_micros_; |
int64_t time_extent_micros_; |
@@ -157,21 +160,20 @@ class ClearProfileVisitor : public SampleVisitor { |
// Each Sample holds a stack trace from an isolate. |
class Sample { |
public: |
- void Init(Isolate* isolate, int64_t timestamp, ThreadId tid) { |
+ void Init(Dart_Port port, int64_t timestamp, ThreadId tid) { |
Clear(); |
timestamp_ = timestamp; |
tid_ = tid; |
- isolate_ = isolate; |
+ port_ = port; |
} |
- // Isolate sample was taken from. |
- Isolate* isolate() const { return isolate_; } |
+ Dart_Port port() const { return port_; } |
// Thread sample was taken on. |
ThreadId tid() const { return tid_; } |
void Clear() { |
- isolate_ = NULL; |
+ port_ = ILLEGAL_PORT; |
pc_marker_ = 0; |
for (intptr_t i = 0; i < kStackBufferSizeInWords; i++) { |
stack_buffer_[i] = 0; |
@@ -268,6 +270,15 @@ class Sample { |
state_ = ClassAllocationSampleBit::update(allocation_sample, state_); |
} |
+ bool is_native_allocation_sample() const { |
+ return NativeAllocationSampleBit::decode(state_); |
+ } |
+ |
+ void set_is_native_allocation_sample(bool native_allocation_sample) { |
+ state_ = |
+ NativeAllocationSampleBit::update(native_allocation_sample, state_); |
+ } |
+ |
Thread::TaskKind thread_task() const { return ThreadTaskBit::decode(state_); } |
void set_thread_task(Thread::TaskKind task) { |
@@ -331,7 +342,8 @@ class Sample { |
kClassAllocationSampleBit = 6, |
kContinuationSampleBit = 7, |
kThreadTaskBit = 8, // 5 bits. |
- kNextFreeBit = 13, |
+ kNativeAllocationSampleBit = 13, |
+ kNextFreeBit = 14, |
}; |
class HeadSampleBit : public BitField<uword, bool, kHeadSampleBit, 1> {}; |
class LeafFrameIsDart : public BitField<uword, bool, kLeafFrameIsDartBit, 1> { |
@@ -348,10 +360,12 @@ class Sample { |
: public BitField<uword, bool, kContinuationSampleBit, 1> {}; |
class ThreadTaskBit |
: public BitField<uword, Thread::TaskKind, kThreadTaskBit, 5> {}; |
+ class NativeAllocationSampleBit |
+ : public BitField<uword, bool, kNativeAllocationSampleBit, 1> {}; |
int64_t timestamp_; |
ThreadId tid_; |
- Isolate* isolate_; |
+ Dart_Port port_; |
uword pc_marker_; |
uword stack_buffer_[kStackBufferSizeInWords]; |
uword vm_tag_; |
@@ -474,7 +488,7 @@ class SampleBuffer { |
// Bad sample. |
continue; |
} |
- if (sample->isolate() != visitor->isolate()) { |
+ if (sample->port() != visitor->port()) { |
// Another isolate. |
continue; |
} |