Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 1 | // Copyright 2018 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Alexei Filippov | 0a57e5d | 2018-05-23 18:13:55 | [diff] [blame] | 5 | #ifndef BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H_ |
| 6 | #define BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H_ |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 7 | |
| 8 | #include <unordered_map> |
| 9 | #include <vector> |
| 10 | |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 11 | #include "base/base_export.h" |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 12 | #include "base/macros.h" |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 13 | #include "base/sampling_heap_profiler/poisson_allocation_sampler.h" |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 14 | #include "base/synchronization/lock.h" |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 15 | |
| 16 | namespace base { |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 17 | |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 18 | template <typename T> |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 19 | class NoDestructor; |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 20 | |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 21 | // The class implements sampling profiling of native memory heap. |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 22 | // It uses PoissonAllocationSampler to aggregate the heap allocations and |
| 23 | // record samples. |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 24 | // The recorded samples can then be retrieved using GetSamples method. |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 25 | class BASE_EXPORT SamplingHeapProfiler |
| 26 | : private PoissonAllocationSampler::SamplesObserver { |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 27 | public: |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 28 | class BASE_EXPORT Sample { |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 29 | public: |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 30 | Sample(const Sample&); |
| 31 | ~Sample(); |
| 32 | |
Alexei Filippov | e6633efc | 2018-03-01 19:31:58 | [diff] [blame] | 33 | size_t size; // Allocation size. |
| 34 | size_t total; // Total size attributed to the sample. |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 35 | std::vector<void*> stack; |
| 36 | |
| 37 | private: |
| 38 | friend class SamplingHeapProfiler; |
| 39 | |
Alexei Filippov | e6633efc | 2018-03-01 19:31:58 | [diff] [blame] | 40 | Sample(size_t, size_t total, uint32_t ordinal); |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 41 | |
| 42 | uint32_t ordinal; |
| 43 | }; |
| 44 | |
| 45 | uint32_t Start(); |
| 46 | void Stop(); |
| 47 | void SetSamplingInterval(size_t sampling_interval); |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 48 | |
| 49 | std::vector<Sample> GetSamples(uint32_t profile_id); |
| 50 | |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 51 | static void Init(); |
| 52 | static SamplingHeapProfiler* Get(); |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 53 | |
| 54 | private: |
| 55 | SamplingHeapProfiler(); |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 56 | ~SamplingHeapProfiler() override; |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 57 | |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 58 | // PoissonAllocationSampler::SamplesObserver |
| 59 | void SampleAdded(void* address, |
| 60 | size_t size, |
| 61 | size_t total, |
| 62 | PoissonAllocationSampler::AllocatorType type, |
| 63 | const char* context) override; |
| 64 | void SampleRemoved(void* address) override; |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 65 | |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 66 | Lock mutex_; |
Alexei Filippov | 0bed5b24 | 2018-07-04 02:08:38 | [diff] [blame] | 67 | std::unordered_map<void*, Sample> samples_; |
Dirk Pranke | 0a3c049 | 2018-07-11 22:26:10 | [diff] [blame] | 68 | uint32_t last_sample_ordinal_ = 1; |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 69 | |
Alexei Filippov | d6363e47 | 2018-08-27 19:31:39 | [diff] [blame] | 70 | friend class NoDestructor<SamplingHeapProfiler>; |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 71 | |
| 72 | DISALLOW_COPY_AND_ASSIGN(SamplingHeapProfiler); |
| 73 | }; |
| 74 | |
Alexei Filippov | 8371762 | 2018-02-21 21:44:40 | [diff] [blame] | 75 | } // namespace base |
Alexei Filippov | 9fbb754 | 2018-02-07 09:56:57 | [diff] [blame] | 76 | |
Alexei Filippov | 0a57e5d | 2018-05-23 18:13:55 | [diff] [blame] | 77 | #endif // BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H_ |