summaryrefslogtreecommitdiff
path: root/include/google/protobuf/arenaz_sampler.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/google/protobuf/arenaz_sampler.h')
-rw-r--r--include/google/protobuf/arenaz_sampler.h207
1 files changed, 0 insertions, 207 deletions
diff --git a/include/google/protobuf/arenaz_sampler.h b/include/google/protobuf/arenaz_sampler.h
deleted file mode 100644
index b04b0cc678..0000000000
--- a/include/google/protobuf/arenaz_sampler.h
+++ /dev/null
@@ -1,207 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_SRC_GOOGLE_PROTOBUF_ARENAZ_SAMPLER_H__
-#define GOOGLE_PROTOBUF_SRC_GOOGLE_PROTOBUF_ARENAZ_SAMPLER_H__
-
-#include <atomic>
-#include <cstddef>
-#include <cstdint>
-
-
-// Must be included last.
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-#if defined(PROTOBUF_ARENAZ_SAMPLE)
-struct ThreadSafeArenaStats;
-void RecordResetSlow(ThreadSafeArenaStats* info);
-void RecordAllocateSlow(ThreadSafeArenaStats* info, size_t requested,
- size_t allocated, size_t wasted);
-// Stores information about a sampled thread safe arena. All mutations to this
-// *must* be made through `Record*` functions below. All reads from this *must*
-// only occur in the callback to `ThreadSafeArenazSampler::Iterate`.
-struct ThreadSafeArenaStats
- : public absl::profiling_internal::Sample<ThreadSafeArenaStats> {
- // Constructs the object but does not fill in any fields.
- ThreadSafeArenaStats();
- ~ThreadSafeArenaStats();
-
- // Puts the object into a clean state, fills in the logically `const` members,
- // blocking for any readers that are currently sampling the object.
- void PrepareForSampling() ABSL_EXCLUSIVE_LOCKS_REQUIRED(init_mu);
-
- // These fields are mutated by the various Record* APIs and need to be
- // thread-safe.
- std::atomic<int> num_allocations;
- std::atomic<int> num_resets;
- std::atomic<size_t> bytes_requested;
- std::atomic<size_t> bytes_allocated;
- std::atomic<size_t> bytes_wasted;
- // Records the largest size an arena ever had. Maintained across resets.
- std::atomic<size_t> max_bytes_allocated;
- // Bit i when set to 1 indicates that a thread with tid % 63 = i accessed the
- // underlying arena. The field is maintained across resets.
- std::atomic<uint64_t> thread_ids;
-
- // All of the fields below are set by `PrepareForSampling`, they must not
- // be mutated in `Record*` functions. They are logically `const` in that
- // sense. These are guarded by init_mu, but that is not externalized to
- // clients, who can only read them during
- // `ThreadSafeArenazSampler::Iterate` which will hold the lock.
- static constexpr int kMaxStackDepth = 64;
- int32_t depth;
- void* stack[kMaxStackDepth];
- static void RecordAllocateStats(ThreadSafeArenaStats* info, size_t requested,
- size_t allocated, size_t wasted) {
- if (PROTOBUF_PREDICT_TRUE(info == nullptr)) return;
- RecordAllocateSlow(info, requested, allocated, wasted);
- }
-};
-
-ThreadSafeArenaStats* SampleSlow(int64_t* next_sample);
-void UnsampleSlow(ThreadSafeArenaStats* info);
-
-class ThreadSafeArenaStatsHandle {
- public:
- explicit ThreadSafeArenaStatsHandle() = default;
- explicit ThreadSafeArenaStatsHandle(ThreadSafeArenaStats* info)
- : info_(info) {}
-
- ~ThreadSafeArenaStatsHandle() {
- if (PROTOBUF_PREDICT_TRUE(info_ == nullptr)) return;
- UnsampleSlow(info_);
- }
-
- ThreadSafeArenaStatsHandle(ThreadSafeArenaStatsHandle&& other) noexcept
- : info_(absl::exchange(other.info_, nullptr)) {}
-
- ThreadSafeArenaStatsHandle& operator=(
- ThreadSafeArenaStatsHandle&& other) noexcept {
- if (PROTOBUF_PREDICT_FALSE(info_ != nullptr)) {
- UnsampleSlow(info_);
- }
- info_ = absl::exchange(other.info_, nullptr);
- return *this;
- }
-
- void RecordReset() {
- if (PROTOBUF_PREDICT_TRUE(info_ == nullptr)) return;
- RecordResetSlow(info_);
- }
-
- ThreadSafeArenaStats* MutableStats() { return info_; }
-
- friend void swap(ThreadSafeArenaStatsHandle& lhs,
- ThreadSafeArenaStatsHandle& rhs) {
- std::swap(lhs.info_, rhs.info_);
- }
-
- friend class ThreadSafeArenaStatsHandlePeer;
-
- private:
- ThreadSafeArenaStats* info_ = nullptr;
-};
-
-using ThreadSafeArenazSampler =
- ::absl::profiling_internal::SampleRecorder<ThreadSafeArenaStats>;
-
-extern PROTOBUF_THREAD_LOCAL int64_t global_next_sample;
-
-// Returns an RAII sampling handle that manages registration and unregistation
-// with the global sampler.
-inline ThreadSafeArenaStatsHandle Sample() {
- if (PROTOBUF_PREDICT_TRUE(--global_next_sample > 0)) {
- return ThreadSafeArenaStatsHandle(nullptr);
- }
- return ThreadSafeArenaStatsHandle(SampleSlow(&global_next_sample));
-}
-
-#else
-struct ThreadSafeArenaStats {
- static void RecordAllocateStats(ThreadSafeArenaStats*, size_t /*requested*/,
- size_t /*allocated*/, size_t /*wasted*/) {}
-};
-
-ThreadSafeArenaStats* SampleSlow(int64_t* next_sample);
-void UnsampleSlow(ThreadSafeArenaStats* info);
-
-class ThreadSafeArenaStatsHandle {
- public:
- explicit ThreadSafeArenaStatsHandle() = default;
- explicit ThreadSafeArenaStatsHandle(ThreadSafeArenaStats*) {}
-
- void RecordReset() {}
-
- ThreadSafeArenaStats* MutableStats() { return nullptr; }
-
- friend void swap(ThreadSafeArenaStatsHandle&, ThreadSafeArenaStatsHandle&) {}
-
- private:
- friend class ThreadSafeArenaStatsHandlePeer;
-};
-
-class ThreadSafeArenazSampler {
- public:
- void Unregister(ThreadSafeArenaStats*) {}
- void SetMaxSamples(int32_t) {}
-};
-
-// Returns an RAII sampling handle that manages registration and unregistation
-// with the global sampler.
-inline ThreadSafeArenaStatsHandle Sample() {
- return ThreadSafeArenaStatsHandle(nullptr);
-}
-#endif // defined(PROTOBUF_ARENAZ_SAMPLE)
-
-// Returns a global Sampler.
-ThreadSafeArenazSampler& GlobalThreadSafeArenazSampler();
-
-// Enables or disables sampling for thread safe arenas.
-void SetThreadSafeArenazEnabled(bool enabled);
-
-// Sets the rate at which thread safe arena will be sampled.
-void SetThreadSafeArenazSampleParameter(int32_t rate);
-
-// Sets a soft max for the number of samples that will be kept.
-void SetThreadSafeArenazMaxSamples(int32_t max);
-
-// Sets the current value for when arenas should be next sampled.
-void SetThreadSafeArenazGlobalNextSample(int64_t next_sample);
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_SRC_PROTOBUF_ARENAZ_SAMPLER_H__