blob: 756653011c7df16b188da76135d5b3e34852ca78 [file] [log] [blame]
Alexei Filippov9fbb7542018-02-07 09:56:571// 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 Filippov0a57e5d2018-05-23 18:13:555#ifndef BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H_
6#define BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H_
Alexei Filippov9fbb7542018-02-07 09:56:577
8#include <unordered_map>
9#include <vector>
10
Alexei Filippov83717622018-02-21 21:44:4011#include "base/base_export.h"
Alexei Filippov9fbb7542018-02-07 09:56:5712#include "base/macros.h"
Alexei Filippovd6363e472018-08-27 19:31:3913#include "base/sampling_heap_profiler/poisson_allocation_sampler.h"
Alexei Filippov9fbb7542018-02-07 09:56:5714#include "base/synchronization/lock.h"
Alexei Filippov9fbb7542018-02-07 09:56:5715
16namespace base {
Alexei Filippov83717622018-02-21 21:44:4017
Alexei Filippov9fbb7542018-02-07 09:56:5718template <typename T>
Alexei Filippov83717622018-02-21 21:44:4019class NoDestructor;
Alexei Filippov9fbb7542018-02-07 09:56:5720
Alexei Filippov83717622018-02-21 21:44:4021// The class implements sampling profiling of native memory heap.
Alexei Filippovd6363e472018-08-27 19:31:3922// It uses PoissonAllocationSampler to aggregate the heap allocations and
23// record samples.
Alexei Filippov83717622018-02-21 21:44:4024// The recorded samples can then be retrieved using GetSamples method.
Alexei Filippovd6363e472018-08-27 19:31:3925class BASE_EXPORT SamplingHeapProfiler
26 : private PoissonAllocationSampler::SamplesObserver {
Alexei Filippov9fbb7542018-02-07 09:56:5727 public:
Alexei Filippov83717622018-02-21 21:44:4028 class BASE_EXPORT Sample {
Alexei Filippov9fbb7542018-02-07 09:56:5729 public:
Alexei Filippov83717622018-02-21 21:44:4030 Sample(const Sample&);
31 ~Sample();
32
Alexei Filippove6633efc2018-03-01 19:31:5833 size_t size; // Allocation size.
34 size_t total; // Total size attributed to the sample.
Alexei Filippov9fbb7542018-02-07 09:56:5735 std::vector<void*> stack;
36
37 private:
38 friend class SamplingHeapProfiler;
39
Alexei Filippove6633efc2018-03-01 19:31:5840 Sample(size_t, size_t total, uint32_t ordinal);
Alexei Filippov9fbb7542018-02-07 09:56:5741
42 uint32_t ordinal;
43 };
44
45 uint32_t Start();
46 void Stop();
47 void SetSamplingInterval(size_t sampling_interval);
Alexei Filippov9fbb7542018-02-07 09:56:5748
49 std::vector<Sample> GetSamples(uint32_t profile_id);
50
Alexei Filippovd6363e472018-08-27 19:31:3951 static void Init();
52 static SamplingHeapProfiler* Get();
Alexei Filippov9fbb7542018-02-07 09:56:5753
54 private:
55 SamplingHeapProfiler();
Alexei Filippovd6363e472018-08-27 19:31:3956 ~SamplingHeapProfiler() override;
Alexei Filippov9fbb7542018-02-07 09:56:5757
Alexei Filippovd6363e472018-08-27 19:31:3958 // 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 Filippov9fbb7542018-02-07 09:56:5765
Alexei Filippovd6363e472018-08-27 19:31:3966 Lock mutex_;
Alexei Filippov0bed5b242018-07-04 02:08:3867 std::unordered_map<void*, Sample> samples_;
Dirk Pranke0a3c0492018-07-11 22:26:1068 uint32_t last_sample_ordinal_ = 1;
Alexei Filippov9fbb7542018-02-07 09:56:5769
Alexei Filippovd6363e472018-08-27 19:31:3970 friend class NoDestructor<SamplingHeapProfiler>;
Alexei Filippov9fbb7542018-02-07 09:56:5771
72 DISALLOW_COPY_AND_ASSIGN(SamplingHeapProfiler);
73};
74
Alexei Filippov83717622018-02-21 21:44:4075} // namespace base
Alexei Filippov9fbb7542018-02-07 09:56:5776
Alexei Filippov0a57e5d2018-05-23 18:13:5577#endif // BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H_