mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
Remove distracting code from dlmalloc
This commit is contained in:
parent
af7bd80430
commit
c8c81af0c7
6 changed files with 28 additions and 467 deletions
130
third_party/dlmalloc/dlmalloc.c
vendored
130
third_party/dlmalloc/dlmalloc.c
vendored
|
@ -41,11 +41,8 @@
|
|||
#define USE_SPIN_LOCKS 1
|
||||
#endif
|
||||
|
||||
#define HAVE_MMAP 1
|
||||
#define HAVE_MREMAP 1
|
||||
#define HAVE_MORECORE 0
|
||||
#define USE_LOCKS 2
|
||||
#define MORECORE_CONTIGUOUS 0
|
||||
#define MALLOC_INSPECT_ALL 1
|
||||
#define ABORT_ON_ASSERT_FAILURE 0
|
||||
#define LOCK_AT_FORK 1
|
||||
|
@ -88,7 +85,7 @@
|
|||
|
||||
/* -------------------------- System allocation -------------------------- */
|
||||
|
||||
/* Get memory from system using MORECORE or MMAP */
|
||||
/* Get memory from system */
|
||||
static void* sys_alloc(mstate m, size_t nb) {
|
||||
char* tbase = CMFAIL;
|
||||
size_t tsize = 0;
|
||||
|
@ -113,90 +110,7 @@ static void* sys_alloc(mstate m, size_t nb) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Try getting memory in any of three ways (in most-preferred to
|
||||
least-preferred order):
|
||||
1. A call to MORECORE that can normally contiguously extend memory.
|
||||
(disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
|
||||
or main space is mmapped or a previous contiguous call failed)
|
||||
2. A call to MMAP new space (disabled if not HAVE_MMAP).
|
||||
Note that under the default settings, if MORECORE is unable to
|
||||
fulfill a request, and HAVE_MMAP is true, then mmap is
|
||||
used as a noncontiguous system allocator. This is a useful backup
|
||||
strategy for systems with holes in address spaces -- in this case
|
||||
sbrk cannot contiguously expand the heap, but mmap may be able to
|
||||
find space.
|
||||
3. A call to MORECORE that cannot usually contiguously extend memory.
|
||||
(disabled if not HAVE_MORECORE)
|
||||
|
||||
In all cases, we need to request enough bytes from system to ensure
|
||||
we can malloc nb bytes upon success, so pad with enough space for
|
||||
top_foot, plus alignment-pad to make sure we don't lose bytes if
|
||||
not on boundary, and round this up to a granularity unit.
|
||||
*/
|
||||
|
||||
if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
|
||||
char* br = CMFAIL;
|
||||
size_t ssize = asize; /* sbrk call size */
|
||||
msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
|
||||
ACQUIRE_MALLOC_GLOBAL_LOCK();
|
||||
|
||||
if (ss == 0) { /* First time through or recovery */
|
||||
char* base = (char*)CALL_MORECORE(0);
|
||||
if (base != CMFAIL) {
|
||||
size_t fp;
|
||||
/* Adjust to end on a page boundary */
|
||||
if (!is_page_aligned(base))
|
||||
ssize += (page_align((size_t)base) - (size_t)base);
|
||||
fp = m->footprint + ssize; /* recheck limits */
|
||||
if (ssize > nb && ssize < HALF_MAX_SIZE_T &&
|
||||
(m->footprint_limit == 0 ||
|
||||
(fp > m->footprint && fp <= m->footprint_limit)) &&
|
||||
(br = (char*)(CALL_MORECORE(ssize))) == base) {
|
||||
tbase = base;
|
||||
tsize = ssize;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Subtract out existing available top space from MORECORE request. */
|
||||
ssize = granularity_align(nb - m->topsize + SYS_ALLOC_PADDING);
|
||||
/* Use mem here only if it did continuously extend old space */
|
||||
if (ssize < HALF_MAX_SIZE_T &&
|
||||
(br = (char*)(CALL_MORECORE(ssize))) == ss->base+ss->size) {
|
||||
tbase = br;
|
||||
tsize = ssize;
|
||||
}
|
||||
}
|
||||
|
||||
if (tbase == CMFAIL) { /* Cope with partial failure */
|
||||
if (br != CMFAIL) { /* Try to use/extend the space we did get */
|
||||
if (ssize < HALF_MAX_SIZE_T &&
|
||||
ssize < nb + SYS_ALLOC_PADDING) {
|
||||
size_t esize = granularity_align(nb + SYS_ALLOC_PADDING - ssize);
|
||||
if (esize < HALF_MAX_SIZE_T) {
|
||||
char* end = (char*)CALL_MORECORE(esize);
|
||||
if (end != CMFAIL)
|
||||
ssize += esize;
|
||||
else { /* Can't use; try to release */
|
||||
(void) CALL_MORECORE(-ssize);
|
||||
br = CMFAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (br != CMFAIL) { /* Use the space we did get */
|
||||
tbase = br;
|
||||
tsize = ssize;
|
||||
}
|
||||
else
|
||||
disable_contiguous(m); /* Don't try contiguous path in the future */
|
||||
}
|
||||
|
||||
RELEASE_MALLOC_GLOBAL_LOCK();
|
||||
}
|
||||
|
||||
if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */
|
||||
if (tbase == CMFAIL) { /* Try MMAP */
|
||||
char* mp = dlmalloc_requires_more_vespene_gas(asize);
|
||||
if (mp != CMFAIL) {
|
||||
tbase = mp;
|
||||
|
@ -205,24 +119,6 @@ static void* sys_alloc(mstate m, size_t nb) {
|
|||
}
|
||||
}
|
||||
|
||||
if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
|
||||
if (asize < HALF_MAX_SIZE_T) {
|
||||
char* br = CMFAIL;
|
||||
char* end = CMFAIL;
|
||||
ACQUIRE_MALLOC_GLOBAL_LOCK();
|
||||
br = (char*)(CALL_MORECORE(asize));
|
||||
end = (char*)(CALL_MORECORE(0));
|
||||
RELEASE_MALLOC_GLOBAL_LOCK();
|
||||
if (br != CMFAIL && end != CMFAIL && br < end) {
|
||||
size_t ssize = end - br;
|
||||
if (ssize > nb + TOP_FOOT_SIZE) {
|
||||
tbase = br;
|
||||
tsize = ssize;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tbase != CMFAIL) {
|
||||
|
||||
if ((m->footprint += tsize) > m->max_footprint)
|
||||
|
@ -362,8 +258,7 @@ static int sys_trim(mstate m, size_t pad) {
|
|||
|
||||
if (!is_extern_segment(sp)) {
|
||||
if (is_mmapped_segment(sp)) {
|
||||
if (HAVE_MMAP &&
|
||||
sp->size >= extra &&
|
||||
if (sp->size >= extra &&
|
||||
!has_segment_link(m, sp)) { /* can't shrink if pinned */
|
||||
size_t newsize = sp->size - extra;
|
||||
(void)newsize; /* placate people compiling -Wunused-variable */
|
||||
|
@ -374,22 +269,6 @@ static int sys_trim(mstate m, size_t pad) {
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (HAVE_MORECORE) {
|
||||
if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
|
||||
extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
|
||||
ACQUIRE_MALLOC_GLOBAL_LOCK();
|
||||
{
|
||||
/* Make sure end of memory is where we last set it. */
|
||||
char* old_br = (char*)(CALL_MORECORE(0));
|
||||
if (old_br == sp->base + sp->size) {
|
||||
char* rel_br = (char*)(CALL_MORECORE(-extra));
|
||||
char* new_br = (char*)(CALL_MORECORE(0));
|
||||
if (rel_br != CMFAIL && new_br < old_br)
|
||||
released = old_br - new_br;
|
||||
}
|
||||
}
|
||||
RELEASE_MALLOC_GLOBAL_LOCK();
|
||||
}
|
||||
}
|
||||
|
||||
if (released != 0) {
|
||||
|
@ -401,8 +280,7 @@ static int sys_trim(mstate m, size_t pad) {
|
|||
}
|
||||
|
||||
/* Unmap any unused mmapped segments */
|
||||
if (HAVE_MMAP)
|
||||
released += release_unused_segments(m);
|
||||
released += release_unused_segments(m);
|
||||
|
||||
/* On failure, disable autotrim to avoid repeated failed future calls */
|
||||
if (released == 0 && m->topsize > m->trim_check)
|
||||
|
|
32
third_party/dlmalloc/init.inc
vendored
32
third_party/dlmalloc/init.inc
vendored
|
@ -1,5 +1,6 @@
|
|||
#include "libc/sysv/consts/auxv.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/nexgen32e/rdtsc.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
||||
/* ---------------------------- setting mparams -------------------------- */
|
||||
|
@ -9,7 +10,6 @@
|
|||
|
||||
void dlmalloc_pre_fork(void) {
|
||||
mstate h;
|
||||
ACQUIRE_MALLOC_GLOBAL_LOCK();
|
||||
for (unsigned i = ARRAYLEN(g_heaps); i--;)
|
||||
if ((h = atomic_load_explicit(&g_heaps[i], memory_order_acquire)))
|
||||
ACQUIRE_LOCK(&h->mutex);
|
||||
|
@ -20,7 +20,6 @@ void dlmalloc_post_fork_parent(void) {
|
|||
for (unsigned i = 0; i < ARRAYLEN(g_heaps); ++i)
|
||||
if ((h = atomic_load_explicit(&g_heaps[i], memory_order_acquire)))
|
||||
RELEASE_LOCK(&h->mutex);
|
||||
RELEASE_MALLOC_GLOBAL_LOCK();
|
||||
}
|
||||
|
||||
void dlmalloc_post_fork_child(void) {
|
||||
|
@ -28,7 +27,6 @@ void dlmalloc_post_fork_child(void) {
|
|||
for (unsigned i = 0; i < ARRAYLEN(g_heaps); ++i)
|
||||
if ((h = atomic_load_explicit(&g_heaps[i], memory_order_acquire)))
|
||||
(void)REFRESH_LOCK(&h->mutex);
|
||||
(void)REFRESH_MALLOC_GLOBAL_LOCK();
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -40,32 +38,14 @@ void dlmalloc_post_fork_child(void) { (void)REFRESH_LOCK(&(gm)->mutex); }
|
|||
|
||||
/* Initialize mparams */
|
||||
__attribute__((__constructor__(49))) int init_mparams(void) {
|
||||
#ifdef NEED_GLOBAL_LOCK_INIT
|
||||
if (malloc_global_mutex_status <= 0)
|
||||
init_malloc_global_mutex();
|
||||
#endif
|
||||
|
||||
// ACQUIRE_MALLOC_GLOBAL_LOCK();
|
||||
if (mparams.magic == 0) {
|
||||
size_t magic;
|
||||
size_t psize;
|
||||
size_t gsize;
|
||||
|
||||
#if defined(__COSMOPOLITAN__)
|
||||
psize = getpagesize();
|
||||
psize = __pagesize;
|
||||
gsize = DEFAULT_GRANULARITY ? DEFAULT_GRANULARITY : psize;
|
||||
#elif !defined(WIN32)
|
||||
psize = malloc_getpagesize;
|
||||
gsize = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : psize);
|
||||
#else /* WIN32 */
|
||||
{
|
||||
SYSTEM_INFO system_info;
|
||||
GetSystemInfo(&system_info);
|
||||
psize = system_info.dwPageSize;
|
||||
gsize = ((DEFAULT_GRANULARITY != 0)?
|
||||
DEFAULT_GRANULARITY : system_info.dwAllocationGranularity);
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
/* Sanity-check configuration:
|
||||
size_t must be unsigned and as wide as pointer type.
|
||||
|
@ -86,11 +66,7 @@ __attribute__((__constructor__(49))) int init_mparams(void) {
|
|||
mparams.page_size = psize;
|
||||
mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
|
||||
mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
|
||||
#if MORECORE_CONTIGUOUS
|
||||
mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
|
||||
#else /* MORECORE_CONTIGUOUS */
|
||||
mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
|
||||
#endif /* MORECORE_CONTIGUOUS */
|
||||
|
||||
#if !ONLY_MSPACES
|
||||
/* Set up lock for main malloc area */
|
||||
|
@ -110,7 +86,7 @@ __attribute__((__constructor__(49))) int init_mparams(void) {
|
|||
}
|
||||
else
|
||||
#endif /* USE_DEV_RANDOM */
|
||||
magic = (size_t)(_rand64() ^ (size_t)0x55555555U);
|
||||
magic = (size_t)(rdtsc() ^ (size_t)0x55555555U);
|
||||
magic |= (size_t)8U; /* ensure nonzero */
|
||||
magic &= ~(size_t)7U; /* improve chances of fault for bad values */
|
||||
/* Until memory modes commonly available, use volatile-write */
|
||||
|
@ -118,8 +94,6 @@ __attribute__((__constructor__(49))) int init_mparams(void) {
|
|||
}
|
||||
}
|
||||
|
||||
// RELEASE_MALLOC_GLOBAL_LOCK();
|
||||
|
||||
#if ONLY_MSPACES
|
||||
threaded_dlmalloc();
|
||||
#endif
|
||||
|
|
6
third_party/dlmalloc/locks.inc
vendored
6
third_party/dlmalloc/locks.inc
vendored
|
@ -125,12 +125,6 @@ static int malloc_unlk(MLOCK_T *lk) {
|
|||
#define INITIAL_LOCK(lk) malloc_inlk(lk)
|
||||
#define REFRESH_LOCK(lk) malloc_wipe(lk)
|
||||
#define DESTROY_LOCK(lk) malloc_kilk(lk)
|
||||
#define INITIAL_MALLOC_GLOBAL_LOCK() INITIAL_LOCK(&malloc_global_mutex);
|
||||
#define REFRESH_MALLOC_GLOBAL_LOCK() REFRESH_LOCK(&malloc_global_mutex);
|
||||
#define ACQUIRE_MALLOC_GLOBAL_LOCK() ACQUIRE_LOCK(&malloc_global_mutex);
|
||||
#define RELEASE_MALLOC_GLOBAL_LOCK() RELEASE_LOCK(&malloc_global_mutex);
|
||||
|
||||
static MLOCK_T malloc_global_mutex;
|
||||
|
||||
#define USE_LOCK_BIT (2U)
|
||||
|
||||
|
|
317
third_party/dlmalloc/platform.inc
vendored
317
third_party/dlmalloc/platform.inc
vendored
|
@ -75,9 +75,6 @@
|
|||
#ifndef MALLOC_INSPECT_ALL
|
||||
#define MALLOC_INSPECT_ALL 0
|
||||
#endif /* MALLOC_INSPECT_ALL */
|
||||
#ifndef HAVE_MMAP
|
||||
#define HAVE_MMAP 1
|
||||
#endif /* HAVE_MMAP */
|
||||
#ifndef MMAP_CLEARS
|
||||
#define MMAP_CLEARS 1
|
||||
#endif /* MMAP_CLEARS */
|
||||
|
@ -92,48 +89,17 @@
|
|||
#ifndef MALLOC_FAILURE_ACTION
|
||||
#define MALLOC_FAILURE_ACTION errno = ENOMEM;
|
||||
#endif /* MALLOC_FAILURE_ACTION */
|
||||
#ifndef HAVE_MORECORE
|
||||
#if ONLY_MSPACES
|
||||
#define HAVE_MORECORE 0
|
||||
#else /* ONLY_MSPACES */
|
||||
#define HAVE_MORECORE 1
|
||||
#endif /* ONLY_MSPACES */
|
||||
#endif /* HAVE_MORECORE */
|
||||
#if !HAVE_MORECORE
|
||||
#define MORECORE_CONTIGUOUS 0
|
||||
#else /* !HAVE_MORECORE */
|
||||
#define MORECORE_DEFAULT sbrk
|
||||
#ifndef MORECORE_CONTIGUOUS
|
||||
#define MORECORE_CONTIGUOUS 1
|
||||
#endif /* MORECORE_CONTIGUOUS */
|
||||
#endif /* HAVE_MORECORE */
|
||||
#ifndef DEFAULT_GRANULARITY
|
||||
#if (MORECORE_CONTIGUOUS || defined(WIN32))
|
||||
#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */
|
||||
#else /* MORECORE_CONTIGUOUS */
|
||||
#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
|
||||
#endif /* MORECORE_CONTIGUOUS */
|
||||
#endif /* DEFAULT_GRANULARITY */
|
||||
#ifndef DEFAULT_TRIM_THRESHOLD
|
||||
#ifndef MORECORE_CANNOT_TRIM
|
||||
#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
|
||||
#else /* MORECORE_CANNOT_TRIM */
|
||||
#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
|
||||
#endif /* MORECORE_CANNOT_TRIM */
|
||||
#endif /* DEFAULT_TRIM_THRESHOLD */
|
||||
#ifndef DEFAULT_MMAP_THRESHOLD
|
||||
#if HAVE_MMAP
|
||||
#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
|
||||
#else /* HAVE_MMAP */
|
||||
#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
|
||||
#endif /* HAVE_MMAP */
|
||||
#endif /* DEFAULT_MMAP_THRESHOLD */
|
||||
#ifndef MAX_RELEASE_CHECK_RATE
|
||||
#if HAVE_MMAP
|
||||
#define MAX_RELEASE_CHECK_RATE 4095
|
||||
#else
|
||||
#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T
|
||||
#endif /* HAVE_MMAP */
|
||||
#endif /* MAX_RELEASE_CHECK_RATE */
|
||||
#ifndef USE_BUILTIN_FFS
|
||||
#define USE_BUILTIN_FFS 0
|
||||
|
@ -185,165 +151,10 @@
|
|||
========================================================================
|
||||
*/
|
||||
|
||||
/* #include "malloc.h" */
|
||||
|
||||
/*------------------------------ internal #includes ---------------------- */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
|
||||
#endif /* _MSC_VER */
|
||||
#if !NO_MALLOC_STATS
|
||||
#endif /* NO_MALLOC_STATS */
|
||||
#ifndef LACKS_ERRNO_H
|
||||
#include <errno.h> /* for MALLOC_FAILURE_ACTION */
|
||||
#endif /* LACKS_ERRNO_H */
|
||||
#ifdef DEBUG
|
||||
#if ABORT_ON_ASSERT_FAILURE
|
||||
#endif /* ABORT_ON_ASSERT_FAILURE */
|
||||
#else /* DEBUG */
|
||||
#ifndef assert
|
||||
#define assert(x)
|
||||
#endif
|
||||
#define DEBUG 0
|
||||
#endif /* DEBUG */
|
||||
#if !defined(WIN32) && !defined(LACKS_TIME_H)
|
||||
#include <time.h> /* for magic initialization */
|
||||
#endif /* WIN32 */
|
||||
#ifndef LACKS_STDLIB_H
|
||||
#include <stdlib.h> /* for abort() */
|
||||
#endif /* LACKS_STDLIB_H */
|
||||
#ifndef LACKS_STRING_H
|
||||
#include <string.h> /* for memset etc */
|
||||
#endif /* LACKS_STRING_H */
|
||||
#if USE_BUILTIN_FFS
|
||||
#ifndef LACKS_STRINGS_H
|
||||
#include <strings.h> /* for ffs */
|
||||
#endif /* LACKS_STRINGS_H */
|
||||
#endif /* USE_BUILTIN_FFS */
|
||||
#if HAVE_MMAP
|
||||
#ifndef LACKS_SYS_MMAN_H
|
||||
/* On some versions of linux, mremap decl in mman.h needs __USE_GNU set */
|
||||
#if (defined(linux) && !defined(__USE_GNU))
|
||||
#define __USE_GNU 1
|
||||
#include <sys/mman.h> /* for mmap */
|
||||
#undef __USE_GNU
|
||||
#else
|
||||
#include <sys/mman.h> /* for mmap */
|
||||
#endif /* linux */
|
||||
#endif /* LACKS_SYS_MMAN_H */
|
||||
#ifndef LACKS_FCNTL_H
|
||||
#include <fcntl.h>
|
||||
#endif /* LACKS_FCNTL_H */
|
||||
#endif /* HAVE_MMAP */
|
||||
#ifndef LACKS_UNISTD_H
|
||||
#include <unistd.h> /* for sbrk, sysconf */
|
||||
#else /* LACKS_UNISTD_H */
|
||||
#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__COSMOPOLITAN__)
|
||||
extern void* sbrk(ptrdiff_t);
|
||||
#endif /* FreeBSD etc */
|
||||
#endif /* LACKS_UNISTD_H */
|
||||
|
||||
/* Declarations for locking */
|
||||
#if USE_LOCKS
|
||||
#ifndef WIN32
|
||||
#if defined (__SVR4) && defined (__sun) /* solaris */
|
||||
#elif !defined(LACKS_SCHED_H)
|
||||
#endif /* solaris or LACKS_SCHED_H */
|
||||
#if (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0) || !USE_SPIN_LOCKS
|
||||
#endif /* USE_RECURSIVE_LOCKS ... */
|
||||
#elif defined(_MSC_VER)
|
||||
#ifndef _M_AMD64
|
||||
/* These are already defined on AMD64 builds */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
LONG __cdecl _InterlockedCompareExchange(LONG volatile *Dest, LONG Exchange, LONG Comp);
|
||||
LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* _M_AMD64 */
|
||||
#pragma intrinsic (_InterlockedCompareExchange)
|
||||
#pragma intrinsic (_InterlockedExchange)
|
||||
#define interlockedcompareexchange _InterlockedCompareExchange
|
||||
#define interlockedexchange _InterlockedExchange
|
||||
#elif defined(WIN32) && defined(__GNUC__)
|
||||
#define interlockedcompareexchange(a, b, c) __sync_val_compare_and_swap(a, c, b)
|
||||
#define interlockedexchange __sync_lock_test_and_set
|
||||
#endif /* Win32 */
|
||||
#else /* USE_LOCKS */
|
||||
#endif /* USE_LOCKS */
|
||||
|
||||
#ifndef LOCK_AT_FORK
|
||||
#define LOCK_AT_FORK 0
|
||||
#endif
|
||||
|
||||
/* Declarations for bit scanning on win32 */
|
||||
#if defined(_MSC_VER) && _MSC_VER>=1300
|
||||
#ifndef BitScanForward /* Try to avoid pulling in WinNT.h */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
unsigned char _BitScanForward(unsigned long *index, unsigned long mask);
|
||||
unsigned char _BitScanReverse(unsigned long *index, unsigned long mask);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#define BitScanForward _BitScanForward
|
||||
#define BitScanReverse _BitScanReverse
|
||||
#pragma intrinsic(_BitScanForward)
|
||||
#pragma intrinsic(_BitScanReverse)
|
||||
#endif /* BitScanForward */
|
||||
#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */
|
||||
|
||||
#ifndef WIN32
|
||||
#ifndef malloc_getpagesize
|
||||
# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */
|
||||
# ifndef _SC_PAGE_SIZE
|
||||
# define _SC_PAGE_SIZE _SC_PAGESIZE
|
||||
# endif
|
||||
# endif
|
||||
# ifdef _SC_PAGE_SIZE
|
||||
# define malloc_getpagesize 4096 /*sysconf(_SC_PAGE_SIZE)*/
|
||||
# else
|
||||
# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
|
||||
extern size_t getpagesize();
|
||||
# define malloc_getpagesize getpagesize()
|
||||
# else
|
||||
# ifdef WIN32 /* use supplied emulation of getpagesize */
|
||||
# define malloc_getpagesize getpagesize()
|
||||
# else
|
||||
# ifndef LACKS_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
# endif
|
||||
# ifdef EXEC_PAGESIZE
|
||||
# define malloc_getpagesize EXEC_PAGESIZE
|
||||
# else
|
||||
# ifdef NBPG
|
||||
# ifndef CLSIZE
|
||||
# define malloc_getpagesize NBPG
|
||||
# else
|
||||
# define malloc_getpagesize (NBPG * CLSIZE)
|
||||
# endif
|
||||
# else
|
||||
# ifdef NBPC
|
||||
# define malloc_getpagesize NBPC
|
||||
# else
|
||||
# ifdef PAGESIZE
|
||||
# define malloc_getpagesize PAGESIZE
|
||||
# else /* just guess */
|
||||
# define malloc_getpagesize ((size_t)4096U)
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* ------------------- size_t and alignment properties -------------------- */
|
||||
|
||||
/* The byte and bit size of a size_t */
|
||||
|
@ -374,141 +185,53 @@ unsigned char _BitScanReverse(unsigned long *index, unsigned long mask);
|
|||
|
||||
/* -------------------------- MMAP preliminaries ------------------------- */
|
||||
|
||||
/*
|
||||
If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
|
||||
checks to fail so compiler optimizer can delete code rather than
|
||||
using so many "#if"s.
|
||||
*/
|
||||
|
||||
|
||||
/* MORECORE and MMAP must return MFAIL on failure */
|
||||
#define MFAIL NULL
|
||||
#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */
|
||||
|
||||
#if HAVE_MMAP
|
||||
|
||||
#ifndef WIN32
|
||||
#define MUNMAP_DEFAULT(a, s) munmap((a), (s))
|
||||
#define MMAP_PROT (PROT_READ|PROT_WRITE)
|
||||
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif /* MAP_ANON */
|
||||
#ifdef MAP_ANONYMOUS
|
||||
#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
|
||||
#define MMAP_DEFAULT(s) _mapanon(s)
|
||||
#else /* MAP_ANONYMOUS */
|
||||
/*
|
||||
Nearly all versions of mmap support MAP_ANONYMOUS, so the following
|
||||
is unlikely to be needed, but is supplied just in case.
|
||||
*/
|
||||
#define MMAP_FLAGS (MAP_PRIVATE)
|
||||
static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
|
||||
#define MMAP_DEFAULT(s) ((dev_zero_fd < 0) ? \
|
||||
(dev_zero_fd = open("/dev/zero", O_RDWR), \
|
||||
mmap_no(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
|
||||
mmap_no(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
|
||||
#endif /* MAP_ANONYMOUS */
|
||||
|
||||
#define DIRECT_MMAP_DEFAULT(s) MMAP_DEFAULT(s)
|
||||
|
||||
#else /* WIN32 */
|
||||
|
||||
/* Win32 MMAP via VirtualAlloc */
|
||||
FORCEINLINE void* win32mmap(size_t size) {
|
||||
void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
|
||||
return (ptr != 0)? ptr: MFAIL;
|
||||
}
|
||||
|
||||
/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
|
||||
FORCEINLINE void* win32direct_mmap(size_t size) {
|
||||
void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
|
||||
PAGE_READWRITE);
|
||||
return (ptr != 0)? ptr: MFAIL;
|
||||
}
|
||||
|
||||
/* This function supports releasing coalesed segments */
|
||||
FORCEINLINE int win32munmap(void* ptr, size_t size) {
|
||||
MEMORY_BASIC_INFORMATION minfo;
|
||||
char* cptr = (char*)ptr;
|
||||
while (size) {
|
||||
if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
|
||||
return -1;
|
||||
if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
|
||||
minfo.State != MEM_COMMIT || minfo.RegionSize > size)
|
||||
return -1;
|
||||
if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
|
||||
return -1;
|
||||
cptr += minfo.RegionSize;
|
||||
size -= minfo.RegionSize;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define MMAP_DEFAULT(s) win32mmap(s)
|
||||
#define MUNMAP_DEFAULT(a, s) win32munmap((a), (s))
|
||||
#define DIRECT_MMAP_DEFAULT(s) win32direct_mmap(s)
|
||||
#endif /* WIN32 */
|
||||
#endif /* HAVE_MMAP */
|
||||
|
||||
#if HAVE_MREMAP
|
||||
#ifndef WIN32
|
||||
#define MREMAP_DEFAULT(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
|
||||
#endif /* WIN32 */
|
||||
#endif /* HAVE_MREMAP */
|
||||
|
||||
/**
|
||||
* Define CALL_MORECORE
|
||||
*/
|
||||
#if HAVE_MORECORE
|
||||
#ifdef MORECORE
|
||||
#define CALL_MORECORE(S) MORECORE(S)
|
||||
#else /* MORECORE */
|
||||
#define CALL_MORECORE(S) MORECORE_DEFAULT(S)
|
||||
#endif /* MORECORE */
|
||||
#else /* HAVE_MORECORE */
|
||||
#define CALL_MORECORE(S) MFAIL
|
||||
#endif /* HAVE_MORECORE */
|
||||
|
||||
/**
|
||||
* Define CALL_MMAP/CALL_MUNMAP/CALL_DIRECT_MMAP
|
||||
*/
|
||||
#if HAVE_MMAP
|
||||
#define USE_MMAP_BIT (SIZE_T_ONE)
|
||||
#define USE_MMAP_BIT (SIZE_T_ONE)
|
||||
|
||||
#ifdef MMAP
|
||||
#define CALL_MMAP(s) MMAP(s)
|
||||
#else /* MMAP */
|
||||
#define CALL_MMAP(s) MMAP_DEFAULT(s)
|
||||
#endif /* MMAP */
|
||||
#ifdef MUNMAP
|
||||
#define CALL_MUNMAP(a, s) MUNMAP((a), (s))
|
||||
#else /* MUNMAP */
|
||||
#define CALL_MUNMAP(a, s) MUNMAP_DEFAULT((a), (s))
|
||||
#endif /* MUNMAP */
|
||||
#ifdef DIRECT_MMAP
|
||||
#define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
|
||||
#else /* DIRECT_MMAP */
|
||||
#define CALL_DIRECT_MMAP(s) DIRECT_MMAP_DEFAULT(s)
|
||||
#endif /* DIRECT_MMAP */
|
||||
#else /* HAVE_MMAP */
|
||||
#define USE_MMAP_BIT (SIZE_T_ZERO)
|
||||
#ifdef MMAP
|
||||
#define CALL_MMAP(s) MMAP(s)
|
||||
#else /* MMAP */
|
||||
#define CALL_MMAP(s) MMAP_DEFAULT(s)
|
||||
#endif /* MMAP */
|
||||
|
||||
#define MMAP(s) MFAIL
|
||||
#define MUNMAP(a, s) (-1)
|
||||
#define DIRECT_MMAP(s) MFAIL
|
||||
#define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
|
||||
#define CALL_MMAP(s) MMAP(s)
|
||||
#define CALL_MUNMAP(a, s) MUNMAP((a), (s))
|
||||
#endif /* HAVE_MMAP */
|
||||
#ifdef MUNMAP
|
||||
#define CALL_MUNMAP(a, s) MUNMAP((a), (s))
|
||||
#else /* MUNMAP */
|
||||
#define CALL_MUNMAP(a, s) MUNMAP_DEFAULT((a), (s))
|
||||
#endif /* MUNMAP */
|
||||
|
||||
#ifdef DIRECT_MMAP
|
||||
#define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
|
||||
#else /* DIRECT_MMAP */
|
||||
#define CALL_DIRECT_MMAP(s) DIRECT_MMAP_DEFAULT(s)
|
||||
#endif /* DIRECT_MMAP */
|
||||
|
||||
/**
|
||||
* Define CALL_MREMAP
|
||||
*/
|
||||
#if HAVE_MMAP && HAVE_MREMAP
|
||||
#if HAVE_MREMAP
|
||||
#define CALL_MREMAP(addr, osz, nsz, mv) ({ int olderr = errno; void *res = mremap((addr), (osz), (nsz), (mv)); if (res == MAP_FAILED) errno = olderr; res; })
|
||||
#else /* HAVE_MMAP && HAVE_MREMAP */
|
||||
#else /* HAVE_MREMAP */
|
||||
#define CALL_MREMAP(addr, osz, nsz, mv) MAP_FAILED
|
||||
#endif /* HAVE_MMAP && HAVE_MREMAP */
|
||||
#endif /* HAVE_MREMAP */
|
||||
|
||||
/* mstate bit set if continguous morecore disabled or failed */
|
||||
#define USE_NONCONTIGUOUS_BIT (4U)
|
||||
|
|
2
third_party/dlmalloc/runtimechecks.inc
vendored
2
third_party/dlmalloc/runtimechecks.inc
vendored
|
@ -28,7 +28,7 @@
|
|||
*/
|
||||
|
||||
#if !INSECURE
|
||||
/* Check if address a is at least as high as any from MORECORE or MMAP */
|
||||
/* Check if address a is at least as high as any from MMAP */
|
||||
#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
|
||||
/* Check if address of next chunk n is higher than base chunk p */
|
||||
#define ok_next(p, n) ((char*)(p) < (char*)(n))
|
||||
|
|
8
third_party/dlmalloc/system.inc
vendored
8
third_party/dlmalloc/system.inc
vendored
|
@ -13,11 +13,7 @@
|
|||
|
||||
#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)
|
||||
|
@ -78,11 +74,7 @@ static int has_segment_link(mstate m, msegmentptr ss) {
|
|||
}
|
||||
}
|
||||
|
||||
#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
|
||||
|
|
Loading…
Reference in a new issue