diff --git a/src/pal/pal.h b/src/pal/pal.h index 5a866a6..8b967b1 100644 --- a/src/pal/pal.h +++ b/src/pal/pal.h @@ -27,7 +27,7 @@ namespace snmalloc # if defined(_WIN32) PALWindows; # elif defined(__APPLE__) - PALApple; + PALApple<>; # elif defined(__linux__) PALLinux; # elif defined(FreeBSD_KERNEL) diff --git a/src/pal/pal_apple.h b/src/pal/pal_apple.h index cc9a96d..72c3feb 100644 --- a/src/pal/pal_apple.h +++ b/src/pal/pal_apple.h @@ -3,15 +3,15 @@ #ifdef __APPLE__ # include "pal_bsd.h" +# include + 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 : public PALBSD + template + class PALApple : public PALBSD> { public: /** @@ -22,6 +22,67 @@ namespace snmalloc * should add any required features. */ static constexpr uint64_t pal_features = PALBSD::pal_features; + + /** + * OS specific function for zeroing memory with the Apple application + * tag id. + * + * See comment below. + */ + template + void zero(void* p, size_t size) + { + 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, + pal_anon_id, + 0); + + if (r != MAP_FAILED) + return; + } + + bzero(p, size); + } + + /** + * Reserve memory with the Apple application tag id. + * + * See comment below. + */ + template + void* reserve(const size_t* size) + { + void* p = mmap( + nullptr, + *size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, + pal_anon_id, + 0); + + if (p == MAP_FAILED) + error("Out of memory"); + + return p; + } + + private: + /** + * Anonymous page tag ID + * + * Darwin platform allows to gives an ID to anonymous pages via + * the VM_MAKE_TAG's macro, from 240 up to 255 are guaranteed + * to be free of usage, however eventually a lower could be taken + * (e.g. LLVM sanitizers has 99) so we can monitor their states + * via vmmap for instance. + */ + static constexpr int pal_anon_id = VM_MAKE_TAG(PALAnonID); }; } // namespace snmalloc #endif diff --git a/src/pal/pal_consts.h b/src/pal/pal_consts.h index b80c543..0261155 100644 --- a/src/pal/pal_consts.h +++ b/src/pal/pal_consts.h @@ -48,4 +48,9 @@ namespace snmalloc */ YesZero }; + + /** + * Default Tag ID for the Apple class + */ + static const int PALAnonDefaultID = 241; } // namespace snmalloc