#ifndef MALLOC_GLUE_H #define MALLOC_GLUE_H #include #include #include #include #include #include #include "atomic.h" #include "syscall.h" #include "libc.h" #include "lock.h" // use macros to appropriately namespace these. #define size_classes __malloc_size_classes #define ctx __malloc_context #define alloc_meta __malloc_alloc_meta #define dump_heap __dump_heap #if USE_REAL_ASSERT #include #else #undef assert #define assert(x) do { if (!(x)) a_crash(); } while(0) #endif #define brk(p) ((uintptr_t)__syscall(SYS_brk, p)) #define mmap __mmap #define madvise __madvise #define mremap __mremap #ifndef a_clz_32 #define a_clz_32 a_clz_32 static inline int a_clz_32(uint32_t x) { #ifdef __GNUC__ return __builtin_clz(x); #else x--; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; x++; return 31-a_ctz_32(x); #endif } #endif static inline uint64_t get_random_secret() { uint64_t secret = (uintptr_t)&secret * 1103515245; for (size_t i=0; libc.auxv[i]; i+=2) if (libc.auxv[i]==AT_RANDOM) memcpy(&secret, (char *)libc.auxv[i+1], sizeof secret); return secret; } #ifndef PAGESIZE #define PAGESIZE PAGE_SIZE #endif static inline size_t get_page_size() { return PAGESIZE; } // no portable "is multithreaded" predicate so assume true #define MT (libc.need_locks) #define RDLOCK_IS_EXCLUSIVE 1 __attribute__((__visibility__("hidden"))) extern int __malloc_lock[1]; #define LOCK_OBJ_DEF \ int __malloc_lock[1]; static inline void rdlock() { if (MT) LOCK(__malloc_lock); } static inline void wrlock() { if (MT) LOCK(__malloc_lock); } static inline void unlock() { UNLOCK(__malloc_lock); } static inline void upgradelock() { } #endif