15 #include "absl/container/internal/hashtablez_sampler.h"
23 #include "absl/base/attributes.h"
24 #include "absl/base/config.h"
25 #include "absl/debugging/stacktrace.h"
26 #include "absl/memory/memory.h"
29 #include "absl/synchronization/mutex.h"
30 #include "absl/utility/utility.h"
34 namespace container_internal {
36 #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
44 ABSL_CONST_INIT std::atomic<int32_t> g_hashtablez_sample_parameter{1 << 10};
45 std::atomic<HashtablezConfigListener> g_hashtablez_config_listener{
nullptr};
47 #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
49 g_exponential_biased_generator;
52 void TriggerHashtablezConfigListener() {
53 auto* listener = g_hashtablez_config_listener.load(std::memory_order_acquire);
54 if (listener !=
nullptr) listener();
59 #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
61 #endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
72 size_t inline_element_size_value) {
73 capacity.store(0, std::memory_order_relaxed);
74 size.store(0, std::memory_order_relaxed);
75 num_erases.store(0, std::memory_order_relaxed);
102 ForceState
state = global_state.load(std::memory_order_relaxed);
105 if (
state == kUninitialized) {
109 global_state.store(
state, std::memory_order_relaxed);
111 return state == kForce;
115 size_t inline_element_size) {
124 #if !defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
133 const int64_t next_stride = g_exponential_biased_generator.GetStride(
134 g_hashtablez_sample_parameter.load(std::memory_order_relaxed));
144 if (!g_hashtablez_enabled.load(std::memory_order_relaxed))
return nullptr;
150 return SampleSlow(next_sample, inline_element_size);
162 size_t distance_from_desired) {
165 size_t probe_length = distance_from_desired;
166 #ifdef ABSL_INTERNAL_HAVE_SSE2
178 std::memory_order_relaxed);
180 info->
size.fetch_add(1, std::memory_order_relaxed);
184 g_hashtablez_config_listener.store(l, std::memory_order_release);
188 return g_hashtablez_enabled.load(std::memory_order_acquire);
193 TriggerHashtablezConfigListener();
197 g_hashtablez_enabled.store(enabled, std::memory_order_release);
201 return g_hashtablez_sample_parameter.load(std::memory_order_acquire);
206 TriggerHashtablezConfigListener();
211 g_hashtablez_sample_parameter.store(rate, std::memory_order_release);
214 static_cast<long long>(rate));
224 TriggerHashtablezConfigListener();
232 static_cast<long long>(
max));