| Index: src/profiler/sampling-heap-profiler.h
 | 
| diff --git a/src/profiler/sampling-heap-profiler.h b/src/profiler/sampling-heap-profiler.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..d9b88e9b861bdaa2d135f53b056f301a6f543096
 | 
| --- /dev/null
 | 
| +++ b/src/profiler/sampling-heap-profiler.h
 | 
| @@ -0,0 +1,135 @@
 | 
| +// Copyright 2015 the V8 project authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#ifndef V8_PROFILER_SAMPLING_HEAP_PROFILER_H_
 | 
| +#define V8_PROFILER_SAMPLING_HEAP_PROFILER_H_
 | 
| +
 | 
| +#include <deque>
 | 
| +#include <map>
 | 
| +#include <set>
 | 
| +#include "include/v8-profiler.h"
 | 
| +#include "src/heap/heap.h"
 | 
| +#include "src/profiler/strings-storage.h"
 | 
| +
 | 
| +namespace v8 {
 | 
| +
 | 
| +namespace base {
 | 
| +class RandomNumberGenerator;
 | 
| +}
 | 
| +
 | 
| +namespace internal {
 | 
| +
 | 
| +
 | 
| +class AllocationProfile : public v8::AllocationProfile {
 | 
| + public:
 | 
| +  AllocationProfile() : nodes_() {}
 | 
| +
 | 
| +  Node* GetRootNode() override {
 | 
| +    return nodes_.size() == 0 ? nullptr : &nodes_.front();
 | 
| +  }
 | 
| +
 | 
| +  std::deque<Node>& nodes() { return nodes_; }
 | 
| +
 | 
| + private:
 | 
| +  std::deque<Node> nodes_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(AllocationProfile);
 | 
| +};
 | 
| +
 | 
| +class SamplingHeapProfiler : public InlineAllocationObserver {
 | 
| + public:
 | 
| +  SamplingHeapProfiler(Heap* heap, StringsStorage* names, uint64_t rate,
 | 
| +                       int stack_depth);
 | 
| +  ~SamplingHeapProfiler();
 | 
| +
 | 
| +  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 {
 | 
| +   public:
 | 
| +    FunctionInfo(SharedFunctionInfo* shared, StringsStorage* names);
 | 
| +    explicit FunctionInfo(const char* name)
 | 
| +        : name_(name),
 | 
| +          script_name_(""),
 | 
| +          script_id_(v8::UnboundScript::kNoScriptId),
 | 
| +          start_position_(0) {}
 | 
| +
 | 
| +    const char* get_name() const { return name_; }
 | 
| +    const char* get_script_name() const { return script_name_; }
 | 
| +    int get_script_id() const { return script_id_; }
 | 
| +    int get_start_position() const { return start_position_; }
 | 
| +
 | 
| +   private:
 | 
| +    const char* const name_;
 | 
| +    const char* script_name_;
 | 
| +    int script_id_;
 | 
| +    const int start_position_;
 | 
| +  };
 | 
| +
 | 
| +  class SampledAllocation {
 | 
| +   public:
 | 
| +    SampledAllocation(SamplingHeapProfiler* sampling_heap_profiler,
 | 
| +                      Isolate* isolate, Local<Value> local, size_t size,
 | 
| +                      int max_frames);
 | 
| +    ~SampledAllocation() {
 | 
| +      for (auto info : stack_) {
 | 
| +        delete info;
 | 
| +      }
 | 
| +      global_.Reset();  // drop the reference.
 | 
| +    }
 | 
| +    size_t get_size() const { return size_; }
 | 
| +    const std::vector<FunctionInfo*>& get_stack() const { return stack_; }
 | 
| +
 | 
| +   private:
 | 
| +    static void OnWeakCallback(const WeakCallbackInfo<SampledAllocation>& data);
 | 
| +
 | 
| +    SamplingHeapProfiler* const sampling_heap_profiler_;
 | 
| +    Global<Value> global_;
 | 
| +    std::vector<FunctionInfo*> stack_;
 | 
| +    const size_t size_;
 | 
| +
 | 
| +    DISALLOW_COPY_AND_ASSIGN(SampledAllocation);
 | 
| +  };
 | 
| +
 | 
| + 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);
 | 
| +
 | 
| +  Isolate* const isolate_;
 | 
| +  Heap* const heap_;
 | 
| +  base::RandomNumberGenerator* const random_;
 | 
| +  StringsStorage* const names_;
 | 
| +  std::set<SampledAllocation*> samples_;
 | 
| +  const uint64_t rate_;
 | 
| +  const int stack_depth_;
 | 
| +};
 | 
| +
 | 
| +
 | 
| +}  // namespace internal
 | 
| +}  // namespace v8
 | 
| +
 | 
| +#endif  // V8_PROFILER_SAMPLING_HEAP_PROFILER_H_
 | 
| 
 |