#ifndef PARTITION_ALLOC_PARTITION_PAGE_H_
#define PARTITION_ALLOC_PARTITION_PAGE_H_
#include <cstdint>
#include "partition_alloc/address_pool_manager.h"
#include "partition_alloc/address_pool_manager_types.h"
#include "partition_alloc/build_config.h"
#include "partition_alloc/buildflags.h"
#include "partition_alloc/freeslot_bitmap_constants.h"
#include "partition_alloc/partition_address_space.h"
#include "partition_alloc/partition_alloc_base/bits.h"
#include "partition_alloc/partition_alloc_base/compiler_specific.h"
#include "partition_alloc/partition_alloc_base/component_export.h"
#include "partition_alloc/partition_alloc_base/thread_annotations.h"
#include "partition_alloc/partition_alloc_check.h"
#include "partition_alloc/partition_alloc_config.h"
#include "partition_alloc/partition_alloc_constants.h"
#include "partition_alloc/partition_alloc_forward.h"
#include "partition_alloc/partition_bucket.h"
#include "partition_alloc/partition_dcheck_helper.h"
#include "partition_alloc/partition_freelist_entry.h"
#include "partition_alloc/partition_page_constants.h"
#include "partition_alloc/partition_superpage_extent_entry.h"
#include "partition_alloc/reservation_offset_table.h"
#if PA_BUILDFLAG(DCHECKS_ARE_ON)
#include "partition_alloc/tagging.h"
#endif
namespace partition_alloc::internal {
#pragma pack(push, 1)
struct SlotSpanMetadata { … };
#pragma pack(pop)
static_assert …;
inline constexpr SlotSpanMetadata::SlotSpanMetadata() noexcept
: … { … }
inline SlotSpanMetadata::SlotSpanMetadata(const SlotSpanMetadata&) = default;
template <MetadataKind kind>
struct SubsequentPageMetadata { … };
#pragma pack(push, 1)
template <MetadataKind kind>
struct PartitionPageMetadataBase { … };
template <MetadataKind kind>
struct PartitionPageMetadata;
template <>
struct PartitionPageMetadata<MetadataKind::kReadOnly>
: public PartitionPageMetadataBase<MetadataKind::kReadOnly> { … };
template <>
struct PartitionPageMetadata<MetadataKind::kWritable>
: public PartitionPageMetadataBase<MetadataKind::kWritable> { … };
#pragma pack(pop)
static_assert …;
static_assert …;
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Winvalid-offsetof"
#endif
static_assert …;
static_assert …;
static_assert …;
static_assert …;
#if defined(__clang__)
#pragma clang diagnostic pop
#endif
PA_ALWAYS_INLINE PartitionPageMetadata<MetadataKind::kReadOnly>*
PartitionSuperPageToMetadataArea(uintptr_t super_page) { … }
PA_ALWAYS_INLINE const SubsequentPageMetadata<MetadataKind::kReadOnly>*
GetSubsequentPageMetadata(
const PartitionPageMetadata<MetadataKind::kReadOnly>* page_metadata) { … }
PA_ALWAYS_INLINE SubsequentPageMetadata<MetadataKind::kWritable>*
GetSubsequentPageMetadata(
PartitionPageMetadata<MetadataKind::kWritable>* page_metadata) { … }
PA_ALWAYS_INLINE PartitionSuperPageExtentEntry<MetadataKind::kReadOnly>*
PartitionSuperPageToExtent(uintptr_t super_page) { … }
PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t
ReservedStateBitmapSize() { … }
PA_ALWAYS_INLINE uintptr_t
SuperPagePayloadStartOffset(bool is_managed_by_normal_buckets) { … }
PA_ALWAYS_INLINE uintptr_t SuperPagePayloadBegin(uintptr_t super_page) { … }
PA_ALWAYS_INLINE uintptr_t SuperPagePayloadEndOffset() { … }
PA_ALWAYS_INLINE uintptr_t SuperPagePayloadEnd(uintptr_t super_page) { … }
PA_ALWAYS_INLINE size_t SuperPagePayloadSize(uintptr_t super_page) { … }
PA_ALWAYS_INLINE PartitionSuperPageExtentEntry<MetadataKind::kReadOnly>*
SlotSpanMetadata::ToSuperPageExtent() const { … }
PA_ALWAYS_INLINE bool IsWithinSuperPagePayload(uintptr_t address) { … }
PA_ALWAYS_INLINE PartitionPageMetadata<MetadataKind::kReadOnly>*
PartitionPageMetadata<MetadataKind::kReadOnly>::FromAddr(uintptr_t address) { … }
PA_ALWAYS_INLINE uintptr_t
SlotSpanMetadata::ToSlotSpanStart(const SlotSpanMetadata* slot_span) { … }
PA_ALWAYS_INLINE SlotSpanMetadata* SlotSpanMetadata::FromAddr(
uintptr_t address) { … }
PA_ALWAYS_INLINE SlotSpanMetadata* SlotSpanMetadata::FromSlotStart(
uintptr_t slot_start) { … }
PA_ALWAYS_INLINE SlotSpanMetadata* SlotSpanMetadata::FromObject(void* object) { … }
PA_ALWAYS_INLINE SlotSpanMetadata* SlotSpanMetadata::FromObjectInnerAddr(
uintptr_t address) { … }
PA_ALWAYS_INLINE SlotSpanMetadata* SlotSpanMetadata::FromObjectInnerPtr(
void* ptr) { … }
PA_ALWAYS_INLINE void SlotSpanMetadata::SetRawSize(size_t raw_size) { … }
PA_ALWAYS_INLINE size_t SlotSpanMetadata::GetRawSize() const { … }
PA_ALWAYS_INLINE void SlotSpanMetadata::SetFreelistHead(
PartitionFreelistEntry* new_head) { … }
PA_ALWAYS_INLINE PartitionFreelistEntry* SlotSpanMetadata::PopForAlloc(
size_t size,
const PartitionFreelistDispatcher* freelist_dispatcher) { … }
PA_ALWAYS_INLINE void SlotSpanMetadata::Free(
uintptr_t slot_start,
PartitionRoot* root,
const PartitionFreelistDispatcher* freelist_dispatcher)
PA_EXCLUSIVE_LOCKS_REQUIRED(PartitionRootLock(root)) { … }
PA_ALWAYS_INLINE void SlotSpanMetadata::AppendFreeList(
PartitionFreelistEntry* head,
PartitionFreelistEntry* tail,
size_t number_of_freed,
PartitionRoot* root,
const PartitionFreelistDispatcher* freelist_dispatcher)
PA_EXCLUSIVE_LOCKS_REQUIRED(PartitionRootLock(root)) { … }
PA_ALWAYS_INLINE bool SlotSpanMetadata::is_active() const { … }
PA_ALWAYS_INLINE bool SlotSpanMetadata::is_full() const { … }
PA_ALWAYS_INLINE bool SlotSpanMetadata::is_empty() const { … }
PA_ALWAYS_INLINE bool SlotSpanMetadata::is_decommitted() const { … }
PA_ALWAYS_INLINE void SlotSpanMetadata::Reset() { … }
template <typename Callback>
void IterateSlotSpans(uintptr_t super_page,
Callback callback) { … }
class PA_COMPONENT_EXPORT(PARTITION_ALLOC) SlotStart { … };
}
#endif