24 #ifndef ABSL_PROFILING_INTERNAL_SAMPLE_RECORDER_H_
25 #define ABSL_PROFILING_INTERNAL_SAMPLE_RECORDER_H_
31 #include "absl/base/config.h"
32 #include "absl/base/thread_annotations.h"
33 #include "absl/synchronization/mutex.h"
34 #include "absl/time/time.h"
38 namespace profiling_internal {
63 template <
typename... Targs>
86 template <
typename... Targs>
124 template <
typename T>
127 return dispose_.exchange(f, std::memory_order_relaxed);
130 template <
typename T>
132 : dropped_samples_(0), size_estimate_(0), all_(nullptr), dispose_(nullptr) {
137 template <
typename T>
139 T*
s = all_.load(std::memory_order_acquire);
140 while (
s !=
nullptr) {
147 template <
typename T>
149 sample->next = all_.load(std::memory_order_relaxed);
150 while (!all_.compare_exchange_weak(sample->next, sample,
151 std::memory_order_release,
152 std::memory_order_relaxed)) {
156 template <
typename T>
158 if (
auto* dispose = dispose_.load(std::memory_order_relaxed)) {
164 sample->dead = graveyard_.dead;
165 graveyard_.dead = sample;
168 template <
typename T>
169 template <
typename... Targs>
176 T* sample = graveyard_.dead;
177 if (sample == &graveyard_)
return nullptr;
180 graveyard_.dead = sample->dead;
181 sample->dead =
nullptr;
182 sample->PrepareForSampling(std::forward<Targs>(
args)...);
186 template <
typename T>
187 template <
typename... Targs>
189 int64_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed);
190 if (
size > max_samples_.load(std::memory_order_relaxed)) {
191 size_estimate_.fetch_sub(1, std::memory_order_relaxed);
192 dropped_samples_.fetch_add(1, std::memory_order_relaxed);
196 T* sample = PopDead(
args...);
197 if (sample ==
nullptr) {
202 sample->PrepareForSampling(std::forward<Targs>(
args)...);
210 template <
typename T>
213 size_estimate_.fetch_sub(1, std::memory_order_relaxed);
216 template <
typename T>
219 T*
s = all_.load(std::memory_order_acquire);
220 while (
s !=
nullptr) {
222 if (
s->dead ==
nullptr) {
228 return dropped_samples_.load(std::memory_order_relaxed);
231 template <
typename T>
233 max_samples_.store(
max, std::memory_order_release);
236 template <
typename T>
238 return max_samples_.load(std::memory_order_acquire);
245 #endif // ABSL_PROFILING_INTERNAL_SAMPLE_RECORDER_H_