| 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..25962d984d1aee54ed96e995be4e61b6edb6a430 | 
| --- /dev/null | 
| +++ b/src/profiler/sampling-heap-profiler.h | 
| @@ -0,0 +1,82 @@ | 
| +// 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 <set> | 
| +#include "src/base/utils/random-number-generator.h" | 
| +#include "src/profiler/allocation-tracker.h" | 
| + | 
| +namespace v8 { | 
| +namespace internal { | 
| + | 
| +class SamplingHeapProfiler : public InlineAllocationObserver { | 
| + public: | 
| +  SamplingHeapProfiler(Heap* heap, StringsStorage* names, uint64_t rate, | 
| +                       int stack_depth); | 
| +  ~SamplingHeapProfiler(); | 
| + | 
| +  void GetHeapSample(OutputStream* stream); | 
| + | 
| +  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_; } | 
| + | 
| +  struct FunctionInfo { | 
| +    FunctionInfo(SharedFunctionInfo* shared, StringsStorage* names); | 
| + | 
| +    const char* const name; | 
| +    const char* script_name; | 
| +    int script_id; | 
| +    int start_position; | 
| +  }; | 
| + | 
| +  class SampledAllocation { | 
| +   public: | 
| +    SampledAllocation(SamplingHeapProfiler* shp, Isolate* isolate, | 
| +                      Local<Value> local, size_t size, int max_frames); | 
| +    ~SampledAllocation() { | 
| +      stack_.Iterate(&DeleteFunctionInfo); | 
| +      global_.Reset();  // drop the reference. | 
| +    } | 
| +    size_t get_size() const { return size_; } | 
| +    List<FunctionInfo*>& get_stack() { return stack_; } | 
| + | 
| +   private: | 
| +    static void OnWeakCallback(const WeakCallbackInfo<SampledAllocation>& data); | 
| +    static void DeleteFunctionInfo(FunctionInfo** infop) { delete *infop; } | 
| + | 
| +    SamplingHeapProfiler* const shp_; | 
| +    Global<Value> global_; | 
| +    List<FunctionInfo*> stack_; | 
| +    const size_t size_; | 
| + | 
| +    DISALLOW_COPY_AND_ASSIGN(SampledAllocation); | 
| +  }; | 
| + | 
| + private: | 
| +  Heap* heap() const { return heap_; } | 
| + | 
| +  void SampleObject(Address soon_object, size_t size); | 
| + | 
| +  static intptr_t GetNextSampleInterval(base::RandomNumberGenerator* random, | 
| +                                        uint64_t rate); | 
| + | 
| +  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_ | 
|  |