#include <google/protobuf/arena.h>
#include <algorithm>
#include <atomic>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <typeinfo>
#include <google/protobuf/arena_impl.h>
#include <google/protobuf/arenaz_sampler.h>
#include <google/protobuf/port.h>
#include <google/protobuf/stubs/mutex.h>
#ifdef ADDRESS_SANITIZER
#include <sanitizer/asan_interface.h>
#endif
#include <google/protobuf/port_def.inc>
namespace google {
namespace protobuf {
namespace internal {
static SerialArena::Memory AllocateMemory(const AllocationPolicy* policy_ptr,
size_t last_size, size_t min_bytes) { … }
class GetDeallocator { … };
SerialArena::SerialArena(Block* b, void* owner, ThreadSafeArenaStats* stats)
: … { … }
SerialArena* SerialArena::New(Memory mem, void* owner,
ThreadSafeArenaStats* stats) { … }
template <typename Deallocator>
SerialArena::Memory SerialArena::Free(Deallocator deallocator) { … }
PROTOBUF_NOINLINE
std::pair<void*, SerialArena::CleanupNode*>
SerialArena::AllocateAlignedWithCleanupFallback(
size_t n, const AllocationPolicy* policy) { … }
PROTOBUF_NOINLINE
void* SerialArena::AllocateAlignedFallback(size_t n,
const AllocationPolicy* policy) { … }
void SerialArena::AllocateNewBlock(size_t n, const AllocationPolicy* policy) { … }
uint64_t SerialArena::SpaceUsed() const { … }
void SerialArena::CleanupList() { … }
ThreadSafeArena::CacheAlignedLifecycleIdGenerator
ThreadSafeArena::lifecycle_id_generator_;
#if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL)
ThreadSafeArena::ThreadCache& ThreadSafeArena::thread_cache() {
static internal::ThreadLocalStorage<ThreadCache>* thread_cache_ =
new internal::ThreadLocalStorage<ThreadCache>();
return *thread_cache_->Get();
}
#elif defined(PROTOBUF_USE_DLLS)
ThreadSafeArena::ThreadCache& ThreadSafeArena::thread_cache() {
static PROTOBUF_THREAD_LOCAL ThreadCache thread_cache_ = {
0, static_cast<LifecycleIdAtomic>(-1), nullptr};
return thread_cache_;
}
#else
PROTOBUF_THREAD_LOCAL ThreadSafeArena::ThreadCache
ThreadSafeArena::thread_cache_ = …;
#endif
void ThreadSafeArena::InitializeFrom(void* mem, size_t size) { … }
void ThreadSafeArena::InitializeWithPolicy(void* mem, size_t size,
AllocationPolicy policy) { … }
void ThreadSafeArena::Init() { … }
void ThreadSafeArena::SetInitialBlock(void* mem, size_t size) { … }
ThreadSafeArena::~ThreadSafeArena() { … }
SerialArena::Memory ThreadSafeArena::Free(size_t* space_allocated) { … }
uint64_t ThreadSafeArena::Reset() { … }
std::pair<void*, SerialArena::CleanupNode*>
ThreadSafeArena::AllocateAlignedWithCleanup(size_t n,
const std::type_info* type) { … }
void ThreadSafeArena::AddCleanup(void* elem, void (*cleanup)(void*)) { … }
PROTOBUF_NOINLINE
void* ThreadSafeArena::AllocateAlignedFallback(size_t n,
const std::type_info* type) { … }
PROTOBUF_NOINLINE
std::pair<void*, SerialArena::CleanupNode*>
ThreadSafeArena::AllocateAlignedWithCleanupFallback(
size_t n, const std::type_info* type) { … }
uint64_t ThreadSafeArena::SpaceAllocated() const { … }
uint64_t ThreadSafeArena::SpaceUsed() const { … }
void ThreadSafeArena::CleanupList() { … }
PROTOBUF_NOINLINE
SerialArena* ThreadSafeArena::GetSerialArenaFallback(void* me) { … }
}
PROTOBUF_FUNC_ALIGN(32)
void* Arena::AllocateAlignedNoHook(size_t n) { … }
PROTOBUF_FUNC_ALIGN(32)
void* Arena::AllocateAlignedWithHook(size_t n, const std::type_info* type) { … }
PROTOBUF_FUNC_ALIGN(32)
void* Arena::AllocateAlignedWithHookForArray(size_t n,
const std::type_info* type) { … }
PROTOBUF_FUNC_ALIGN(32)
std::pair<void*, internal::SerialArena::CleanupNode*>
Arena::AllocateAlignedWithCleanup(size_t n, const std::type_info* type) { … }
}
}
#include <google/protobuf/port_undef.inc>