diff --git a/src/pal/pal_apple.h b/src/pal/pal_apple.h index 97f72bb..cc9a96d 100644 --- a/src/pal/pal_apple.h +++ b/src/pal/pal_apple.h @@ -1,89 +1,27 @@ #pragma once #ifdef __APPLE__ -# include "../ds/bits.h" -# include "../mem/allocconfig.h" - -# include -# include -# include - -extern "C" int puts(const char* str); +# include "pal_bsd.h" namespace snmalloc { /** * PAL implementation for Apple systems (macOS, iOS, watchOS, tvOS...). + * + * XNU behaves exactly like a generic BSD platform but this class exists + * as a place to add XNU-specific behaviour later, if required. */ - class PALApple + class PALApple : public PALBSD { public: /** - * Bitmap of PalFeatures flags indicating the optional features that this - * PAL supports. + * The features exported by this PAL. + * + * Currently, these are identical to the generic BSD PAL. This field is + * declared explicitly to remind anyone who modifies this class that they + * should add any required features. */ - static constexpr uint64_t pal_features = LazyCommit; - static void error(const char* const str) - { - puts(str); - abort(); - } - - /// Notify platform that we will not be using these pages - void notify_not_using(void* p, size_t size) noexcept - { - assert(bits::is_aligned_block(p, size)); - madvise(p, size, MADV_FREE); - } - - /// Notify platform that we will be using these pages - template - void notify_using(void* p, size_t size) noexcept - { - assert( - bits::is_aligned_block(p, size) || (zero_mem == NoZero)); - if constexpr (zero_mem == YesZero) - zero(p, size); - } - - /// OS specific function for zeroing memory - template - void zero(void* p, size_t size) noexcept - { - if (page_aligned || bits::is_aligned_block(p, size)) - { - assert(bits::is_aligned_block(p, size)); - void* r = mmap( - p, - size, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, - -1, - 0); - - if (r != MAP_FAILED) - return; - } - - bzero(p, size); - } - - template - void* reserve(size_t* size) noexcept - { - void* p = mmap( - NULL, - *size, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, - -1, - 0); - - if (p == MAP_FAILED) - error("Out of memory"); - - return p; - } + static constexpr uint64_t pal_features = PALBSD::pal_features; }; -} +} // namespace snmalloc #endif