mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-28 00:02:28 +00:00
Make emacs not croak when editing dlmalloc
This commit is contained in:
parent
3c7ae0fc72
commit
fa1e8a3e65
21 changed files with 3019 additions and 2985 deletions
120
third_party/dlmalloc/init.inc
vendored
Normal file
120
third_party/dlmalloc/init.inc
vendored
Normal file
|
@ -0,0 +1,120 @@
|
|||
// clang-format off
|
||||
|
||||
/* ---------------------------- setting mparams -------------------------- */
|
||||
|
||||
#if LOCK_AT_FORK
|
||||
static void pre_fork(void) { ACQUIRE_LOCK(&(gm)->mutex); }
|
||||
static void post_fork_parent(void) { RELEASE_LOCK(&(gm)->mutex); }
|
||||
static void post_fork_child(void) { INITIAL_LOCK(&(gm)->mutex); }
|
||||
#endif /* LOCK_AT_FORK */
|
||||
|
||||
/* Initialize mparams */
|
||||
static 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 = 4096;
|
||||
gsize = 65536;
|
||||
#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.
|
||||
ints must be at least 4 bytes.
|
||||
alignment must be at least 8.
|
||||
Alignment, min chunk size, and page size must all be powers of 2.
|
||||
*/
|
||||
if ((sizeof(size_t) != sizeof(char*)) ||
|
||||
(MAX_SIZE_T < MIN_CHUNK_SIZE) ||
|
||||
(sizeof(int) < 4) ||
|
||||
(MALLOC_ALIGNMENT < (size_t)8U) ||
|
||||
((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) ||
|
||||
((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) ||
|
||||
((gsize & (gsize-SIZE_T_ONE)) != 0) ||
|
||||
((psize & (psize-SIZE_T_ONE)) != 0))
|
||||
ABORT;
|
||||
mparams.granularity = gsize;
|
||||
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 */
|
||||
gm->mflags = mparams.default_mflags;
|
||||
(void)INITIAL_LOCK(&gm->mutex);
|
||||
#endif
|
||||
#if LOCK_AT_FORK
|
||||
pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
|
||||
#endif
|
||||
|
||||
{
|
||||
#if USE_DEV_RANDOM
|
||||
int fd;
|
||||
unsigned char buf[sizeof(size_t)];
|
||||
/* Try to use /dev/urandom, else fall back on using time */
|
||||
if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
|
||||
read(fd, buf, sizeof(buf)) == sizeof(buf)) {
|
||||
magic = *((size_t *) buf);
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
#endif /* USE_DEV_RANDOM */
|
||||
magic = (size_t)(rand64() ^ (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 */
|
||||
(*(volatile size_t *)(&(mparams.magic))) = magic;
|
||||
}
|
||||
}
|
||||
|
||||
RELEASE_MALLOC_GLOBAL_LOCK();
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* support for mallopt */
|
||||
static int change_mparam(int param_number, int value) {
|
||||
size_t val;
|
||||
ensure_initialization();
|
||||
val = (value == -1)? MAX_SIZE_T : (size_t)value;
|
||||
switch(param_number) {
|
||||
case M_TRIM_THRESHOLD:
|
||||
mparams.trim_threshold = val;
|
||||
return 1;
|
||||
case M_GRANULARITY:
|
||||
if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
|
||||
mparams.granularity = val;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
case M_MMAP_THRESHOLD:
|
||||
mparams.mmap_threshold = val;
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue