mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
d5910e2673
- Fixed bug where stdio eof wasn't being sticky - Fixed bug where fseeko() wasn't clearing eof state - Removed assert() usage from libc favoring _unassert() / _npassert()
523 lines
16 KiB
C++
523 lines
16 KiB
C++
// clang-format off
|
|
|
|
#define LACKS_UNISTD_H
|
|
#define LACKS_FCNTL_H
|
|
#define LACKS_SYS_PARAM_H
|
|
#define LACKS_SYS_MMAN_H
|
|
#define LACKS_STRINGS_H
|
|
#define LACKS_STRING_H
|
|
#define LACKS_SYS_TYPES_H
|
|
#define LACKS_ERRNO_H
|
|
#define LACKS_STDLIB_H
|
|
#define LACKS_SCHED_H
|
|
#define LACKS_TIME_H
|
|
|
|
/* Version identifier to allow people to support multiple versions */
|
|
#ifndef DLMALLOC_VERSION
|
|
#define DLMALLOC_VERSION 20806
|
|
#endif /* DLMALLOC_VERSION */
|
|
|
|
#ifndef DLMALLOC_EXPORT
|
|
#define DLMALLOC_EXPORT extern
|
|
#endif
|
|
|
|
/* The maximum possible size_t value has all bits set */
|
|
#define MAX_SIZE_T (~(size_t)0)
|
|
|
|
#ifndef USE_LOCKS /* ensure true if spin or recursive locks set */
|
|
#define USE_LOCKS ((defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || \
|
|
(defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0))
|
|
#endif /* USE_LOCKS */
|
|
|
|
#if USE_LOCKS /* Spin locks for gcc >= 4.1, older gcc on x86, MSC >= 1310 */
|
|
#if ((defined(__GNUC__) && \
|
|
((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \
|
|
defined(__i386__) || defined(__x86_64__))) || \
|
|
(defined(_MSC_VER) && _MSC_VER>=1310))
|
|
#ifndef USE_SPIN_LOCKS
|
|
#define USE_SPIN_LOCKS 1
|
|
#endif /* USE_SPIN_LOCKS */
|
|
#elif USE_SPIN_LOCKS
|
|
#error "USE_SPIN_LOCKS defined without implementation"
|
|
#endif /* ... locks available... */
|
|
#elif !defined(USE_SPIN_LOCKS)
|
|
#define USE_SPIN_LOCKS 0
|
|
#endif /* USE_LOCKS */
|
|
|
|
#ifndef ONLY_MSPACES
|
|
#define ONLY_MSPACES 0
|
|
#endif /* ONLY_MSPACES */
|
|
#ifndef MSPACES
|
|
#if ONLY_MSPACES
|
|
#define MSPACES 1
|
|
#else /* ONLY_MSPACES */
|
|
#define MSPACES 0
|
|
#endif /* ONLY_MSPACES */
|
|
#endif /* MSPACES */
|
|
#ifndef MALLOC_ALIGNMENT
|
|
#define MALLOC_ALIGNMENT ((size_t)(2 * sizeof(void *)))
|
|
#endif /* MALLOC_ALIGNMENT */
|
|
#ifndef FOOTERS
|
|
#define FOOTERS 0
|
|
#endif /* FOOTERS */
|
|
#ifndef ABORT
|
|
#define ABORT dlmalloc_abort()
|
|
#endif /* ABORT */
|
|
#ifndef ABORT_ON_ASSERT_FAILURE
|
|
#define ABORT_ON_ASSERT_FAILURE 1
|
|
#endif /* ABORT_ON_ASSERT_FAILURE */
|
|
#ifndef PROCEED_ON_ERROR
|
|
#define PROCEED_ON_ERROR 0
|
|
#endif /* PROCEED_ON_ERROR */
|
|
|
|
#ifndef INSECURE
|
|
#define INSECURE 0
|
|
#endif /* INSECURE */
|
|
#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 */
|
|
#ifndef HAVE_MREMAP
|
|
#ifdef linux
|
|
#define HAVE_MREMAP 1
|
|
#define _GNU_SOURCE /* Turns on mremap() definition */
|
|
#else /* linux */
|
|
#define HAVE_MREMAP 0
|
|
#endif /* linux */
|
|
#endif /* HAVE_MREMAP */
|
|
#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
|
|
#endif /* USE_BUILTIN_FFS */
|
|
#ifndef USE_DEV_RANDOM
|
|
#define USE_DEV_RANDOM 0
|
|
#endif /* USE_DEV_RANDOM */
|
|
#ifndef NO_MALLINFO
|
|
#define NO_MALLINFO 0
|
|
#endif /* NO_MALLINFO */
|
|
#ifndef MALLINFO_FIELD_TYPE
|
|
#define MALLINFO_FIELD_TYPE size_t
|
|
#endif /* MALLINFO_FIELD_TYPE */
|
|
#ifndef NO_MALLOC_STATS
|
|
#define NO_MALLOC_STATS 0
|
|
#endif /* NO_MALLOC_STATS */
|
|
#ifndef NO_SEGMENT_TRAVERSAL
|
|
#define NO_SEGMENT_TRAVERSAL 0
|
|
#endif /* NO_SEGMENT_TRAVERSAL */
|
|
|
|
/*
|
|
mallopt tuning options. SVID/XPG defines four standard parameter
|
|
numbers for mallopt, normally defined in malloc.h. None of these
|
|
are used in this malloc, so setting them has no effect. But this
|
|
malloc does support the following options.
|
|
*/
|
|
|
|
#define M_TRIM_THRESHOLD (-1)
|
|
#define M_GRANULARITY (-2)
|
|
#define M_MMAP_THRESHOLD (-3)
|
|
|
|
/* ------------------------ Mallinfo declarations ------------------------ */
|
|
|
|
/*
|
|
Try to persuade compilers to inline. The most critical functions for
|
|
inlining are defined as macros, so these aren't used for them.
|
|
*/
|
|
|
|
#define FORCEINLINE forceinline
|
|
#define NOINLINE dontinline
|
|
|
|
/*
|
|
========================================================================
|
|
To make a fully customizable malloc.h header file, cut everything
|
|
#include "libc/sysv/consts/map.h"
|
|
#include "libc/runtime/runtime.h"
|
|
above this line, put into file malloc.h, edit to suit, and #include it
|
|
on the next line, as well as in programs that use this malloc.
|
|
========================================================================
|
|
*/
|
|
|
|
/* #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 */
|
|
#define SIZE_T_SIZE (sizeof(size_t))
|
|
#define SIZE_T_BITSIZE (sizeof(size_t) << 3)
|
|
|
|
/* Some constants coerced to size_t */
|
|
/* Annoying but necessary to avoid errors on some platforms */
|
|
#define SIZE_T_ZERO ((size_t)0)
|
|
#define SIZE_T_ONE ((size_t)1)
|
|
#define SIZE_T_TWO ((size_t)2)
|
|
#define SIZE_T_FOUR ((size_t)4)
|
|
#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1)
|
|
#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2)
|
|
#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
|
|
#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U)
|
|
|
|
/* The bit mask value corresponding to MALLOC_ALIGNMENT */
|
|
#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE)
|
|
|
|
/* True if address a has acceptable alignment */
|
|
#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
|
|
|
|
/* the number of bytes to offset an address to align it */
|
|
#define align_offset(A)\
|
|
((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
|
|
((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_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)
|
|
|
|
#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)
|
|
|
|
#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 */
|
|
|
|
/**
|
|
* Define CALL_MREMAP
|
|
*/
|
|
#if HAVE_MMAP && HAVE_MREMAP
|
|
#ifdef MREMAP
|
|
#define CALL_MREMAP(addr, osz, nsz, mv) MREMAP((addr), (osz), (nsz), (mv))
|
|
#else /* MREMAP */
|
|
#define CALL_MREMAP(addr, osz, nsz, mv) MREMAP_DEFAULT((addr), (osz), (nsz), (mv))
|
|
#endif /* MREMAP */
|
|
#else /* HAVE_MMAP && HAVE_MREMAP */
|
|
#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
|
|
#endif /* HAVE_MMAP && HAVE_MREMAP */
|
|
|
|
/* mstate bit set if continguous morecore disabled or failed */
|
|
#define USE_NONCONTIGUOUS_BIT (4U)
|
|
|
|
/* segment bit set in create_mspace_with_base */
|
|
#define EXTERN_BIT (8U)
|
|
|