Index: src/profiler/sampling-heap-profiler.h |
diff --git a/src/profiler/sampling-heap-profiler.h b/src/profiler/sampling-heap-profiler.h |
index d9b88e9b861bdaa2d135f53b056f301a6f543096..1f98bec849f80f7f068c8e903d6b6b8e190f79e2 100644 |
--- a/src/profiler/sampling-heap-profiler.h |
+++ b/src/profiler/sampling-heap-profiler.h |
@@ -20,24 +20,25 @@ class RandomNumberGenerator; |
namespace internal { |
+class SamplingAllocationObserver; |
class AllocationProfile : public v8::AllocationProfile { |
public: |
AllocationProfile() : nodes_() {} |
- Node* GetRootNode() override { |
+ v8::AllocationProfile::Node* GetRootNode() override { |
return nodes_.size() == 0 ? nullptr : &nodes_.front(); |
} |
- std::deque<Node>& nodes() { return nodes_; } |
+ std::deque<v8::AllocationProfile::Node>& nodes() { return nodes_; } |
private: |
- std::deque<Node> nodes_; |
+ std::deque<v8::AllocationProfile::Node> nodes_; |
DISALLOW_COPY_AND_ASSIGN(AllocationProfile); |
}; |
-class SamplingHeapProfiler : public InlineAllocationObserver { |
+class SamplingHeapProfiler { |
public: |
SamplingHeapProfiler(Heap* heap, StringsStorage* names, uint64_t rate, |
int stack_depth); |
@@ -45,11 +46,6 @@ class SamplingHeapProfiler : public InlineAllocationObserver { |
v8::AllocationProfile* GetAllocationProfile(); |
- void Step(int bytes_allocated, Address soon_object, size_t size) override; |
- intptr_t GetNextStepSize() override { |
- return GetNextSampleInterval(random_, rate_); |
- } |
- |
StringsStorage* names() const { return names_; } |
class FunctionInfo { |
@@ -99,35 +95,61 @@ class SamplingHeapProfiler : public InlineAllocationObserver { |
}; |
private: |
- using Node = v8::AllocationProfile::Node; |
- |
Heap* heap() const { return heap_; } |
void SampleObject(Address soon_object, size_t size); |
- static intptr_t GetNextSampleInterval(base::RandomNumberGenerator* random, |
- uint64_t rate); |
- |
// Methods that construct v8::AllocationProfile. |
- Node* AddStack(AllocationProfile* profile, |
- const std::map<int, Script*>& scripts, |
- const std::vector<FunctionInfo*>& stack); |
- Node* FindOrAddChildNode(AllocationProfile* profile, |
- const std::map<int, Script*>& scripts, Node* parent, |
- FunctionInfo* function_info); |
- Node* AllocateNode(AllocationProfile* profile, |
- const std::map<int, Script*>& scripts, |
- FunctionInfo* function_info); |
+ v8::AllocationProfile::Node* AddStack( |
+ AllocationProfile* profile, const std::map<int, Script*>& scripts, |
+ const std::vector<FunctionInfo*>& stack); |
+ v8::AllocationProfile::Node* FindOrAddChildNode( |
+ AllocationProfile* profile, const std::map<int, Script*>& scripts, |
+ v8::AllocationProfile::Node* parent, FunctionInfo* function_info); |
+ v8::AllocationProfile::Node* AllocateNode( |
+ AllocationProfile* profile, const std::map<int, Script*>& scripts, |
+ FunctionInfo* function_info); |
Isolate* const isolate_; |
Heap* const heap_; |
- base::RandomNumberGenerator* const random_; |
+ base::SmartPointer<SamplingAllocationObserver> new_space_observer_; |
+ base::SmartPointer<SamplingAllocationObserver> other_spaces_observer_; |
StringsStorage* const names_; |
std::set<SampledAllocation*> samples_; |
- const uint64_t rate_; |
const int stack_depth_; |
+ |
+ friend class SamplingAllocationObserver; |
}; |
+class SamplingAllocationObserver : public AllocationObserver { |
+ public: |
+ SamplingAllocationObserver(Heap* heap, intptr_t step_size, uint64_t rate, |
+ SamplingHeapProfiler* profiler, |
+ base::RandomNumberGenerator* random) |
+ : AllocationObserver(step_size), |
+ profiler_(profiler), |
+ heap_(heap), |
+ random_(random), |
+ rate_(rate) {} |
+ virtual ~SamplingAllocationObserver() {} |
+ |
+ protected: |
+ void Step(int bytes_allocated, Address soon_object, size_t size) override { |
+ USE(heap_); |
+ DCHECK(heap_->gc_state() == Heap::NOT_IN_GC); |
+ DCHECK(soon_object); |
+ profiler_->SampleObject(soon_object, size); |
+ } |
+ |
+ intptr_t GetNextStepSize() override { return GetNextSampleInterval(rate_); } |
+ |
+ private: |
+ intptr_t GetNextSampleInterval(uint64_t rate); |
+ SamplingHeapProfiler* const profiler_; |
+ Heap* const heap_; |
+ base::RandomNumberGenerator* const random_; |
+ uint64_t const rate_; |
+}; |
} // namespace internal |
} // namespace v8 |