#pragma once
#if defined(__sun)
# include "pal_posix.h"
namespace snmalloc
{
class PALSolaris : public PALPOSIX<PALSolaris>
{
public:
static constexpr uint64_t pal_features =
AlignedAllocation | PALPOSIX::pal_features;
static constexpr size_t page_size =
Aal::aal_name == Sparc ? 0x2000 : 0x1000;
static constexpr size_t minimum_alloc_size = page_size;
static constexpr int default_mmap_flags = MAP_NORESERVE;
template<bool state_using>
static void* reserve_aligned(size_t size) noexcept
{
SNMALLOC_ASSERT(bits::is_pow2(size));
SNMALLOC_ASSERT(size >= minimum_alloc_size);
UNUSED(state_using);
uintptr_t alignment =
static_cast<uintptr_t>(bits::align_up(size, page_size));
auto prot =
!mitigations(pal_enforce_access) ? PROT_READ | PROT_WRITE : PROT_NONE;
void* p = mmap(
(void*)alignment,
size,
prot,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGN | default_mmap_flags,
-1,
0);
if (p == MAP_FAILED)
return nullptr;
return p;
}
};
} #endif