mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
fa20edc44d
- Remove most __ASSEMBLER__ __LINKER__ ifdefs - Rename libc/intrin/bits.h to libc/serialize.h - Block pthread cancelation in fchmodat() polyfill - Remove `clang-format off` statements in third_party
93 lines
2.7 KiB
C++
93 lines
2.7 KiB
C++
|
|
/* -------------------------- system alloc setup ------------------------- */
|
|
|
|
/* Operations on mflags */
|
|
|
|
#define use_lock(M) ((M)->mflags & USE_LOCK_BIT)
|
|
#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT)
|
|
#if USE_LOCKS
|
|
#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT)
|
|
#else
|
|
#define disable_lock(M)
|
|
#endif
|
|
|
|
#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT)
|
|
#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT)
|
|
#if HAVE_MMAP
|
|
#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT)
|
|
#else
|
|
#define disable_mmap(M)
|
|
#endif
|
|
|
|
#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT)
|
|
#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT)
|
|
|
|
#define set_lock(M,L)\
|
|
((M)->mflags = (L)?\
|
|
((M)->mflags | USE_LOCK_BIT) :\
|
|
((M)->mflags & ~USE_LOCK_BIT))
|
|
|
|
/* page-align a size */
|
|
#define page_align(S)\
|
|
(((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE))
|
|
|
|
/* granularity-align a size */
|
|
#define granularity_align(S)\
|
|
(((S) + (mparams.granularity - SIZE_T_ONE))\
|
|
& ~(mparams.granularity - SIZE_T_ONE))
|
|
|
|
|
|
/* For mmap, use granularity alignment on windows, else page-align */
|
|
#if defined(WIN32) || defined(__COSMOPOLITAN__)
|
|
#define mmap_align(S) granularity_align(S)
|
|
#else
|
|
#define mmap_align(S) page_align(S)
|
|
#endif
|
|
|
|
/* For sys_alloc, enough padding to ensure can malloc request on success */
|
|
#define SYS_ALLOC_PADDING (TOP_FOOT_SIZE + MALLOC_ALIGNMENT)
|
|
|
|
#define is_page_aligned(S)\
|
|
(((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
|
|
#define is_granularity_aligned(S)\
|
|
(((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
|
|
|
|
/* True if segment S holds address A */
|
|
#define segment_holds(S, A)\
|
|
((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
|
|
|
|
/* Return segment holding given address */
|
|
static msegmentptr segment_holding(mstate m, char* addr) {
|
|
msegmentptr sp = &m->seg;
|
|
for (;;) {
|
|
if (addr >= sp->base && addr < sp->base + sp->size)
|
|
return sp;
|
|
if ((sp = sp->next) == 0)
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* Return true if segment contains a segment link */
|
|
static int has_segment_link(mstate m, msegmentptr ss) {
|
|
msegmentptr sp = &m->seg;
|
|
for (;;) {
|
|
if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
|
|
return 1;
|
|
if ((sp = sp->next) == 0)
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
#ifndef MORECORE_CANNOT_TRIM
|
|
#define should_trim(M,s) ((s) > (M)->trim_check)
|
|
#else /* MORECORE_CANNOT_TRIM */
|
|
#define should_trim(M,s) (0)
|
|
#endif /* MORECORE_CANNOT_TRIM */
|
|
|
|
/*
|
|
TOP_FOOT_SIZE is padding at the end of a segment, including space
|
|
that may be needed to place segment records and fenceposts when new
|
|
noncontiguous segments are added.
|
|
*/
|
|
#define TOP_FOOT_SIZE\
|
|
(align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
|