util.h revision d81e4bdd5c991bd5642c8b859ef1f752b51cd9be
1d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 2d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_TYPES 3d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 4d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* Size of stack-allocated buffer passed to buferror(). */ 5d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define BUFERROR_BUF 64 6d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 7d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* 8d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * Define a custom assert() in order to reduce the chances of deadlock during 9d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * assertion failure. 10d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 11d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef assert 12d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define assert(e) do { \ 13d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug && !(e)) { \ 14d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf( \ 15d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "<jemalloc>: %s:%d: Failed assertion: \"%s\"\n", \ 16d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__, #e); \ 17d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 18d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 19d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 20d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 21d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 22d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* Use to assert a particular configuration, e.g., cassert(config_debug). */ 23d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define cassert(c) do { \ 24d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if ((c) == false) \ 25d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans assert(false); \ 26d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 27d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 28d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef not_reached 29d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define not_reached() do { \ 30d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug) { \ 31d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf( \ 32d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "<jemalloc>: %s:%d: Unreachable code reached\n", \ 33d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__); \ 34d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 35d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 36d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 37d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 38d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 39d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef not_implemented 40d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define not_implemented() do { \ 41d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug) { \ 42d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf("<jemalloc>: %s:%d: Not implemented\n", \ 43d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__); \ 44d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 45d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 46d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 47d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 48d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 49d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define assert_not_implemented(e) do { \ 50d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug && !(e)) \ 51d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans not_implemented(); \ 52d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 53d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 54d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_TYPES */ 55d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 56d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_STRUCTS 57d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 58d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_STRUCTS */ 59d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 60d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_EXTERNS 61d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 62d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansextern void (*je_malloc_message)(void *wcbopaque, const char *s); 63d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 64d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansint buferror(int errnum, char *buf, size_t buflen); 65d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 66d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* 67d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * malloc_vsnprintf() supports a subset of snprintf(3) that avoids floating 68d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * point math. 69d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 70d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansint malloc_vsnprintf(char *str, size_t size, const char *format, 71d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans va_list ap); 72d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansint malloc_snprintf(char *str, size_t size, const char *format, ...) 73d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans JEMALLOC_ATTR(format(printf, 3, 4)); 74d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* 75d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * malloc_[v]tprintf() prints to a thread-local string buffer, so the result is 76d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * overwritten by the next call to malloc_[v]{,c,t}printf(). 77d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 78d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansconst char * malloc_vtprintf(const char *format, va_list ap); 79d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansconst char * malloc_tprintf(const char *format, ...) 80d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans JEMALLOC_ATTR(format(printf, 1, 2)); 81d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque, 82d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans const char *format, va_list ap); 83d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_cprintf(void (*write)(void *, const char *), void *cbopaque, 84d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans const char *format, ...) JEMALLOC_ATTR(format(printf, 3, 4)); 85d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_printf(const char *format, ...) 86d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans JEMALLOC_ATTR(format(printf, 1, 2)); 87d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 88d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_EXTERNS */ 89d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 90d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_INLINES 91d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 92d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef JEMALLOC_ENABLE_INLINE 93d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evanssize_t pow2_ceil(size_t x); 94d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_write(const char *s); 95d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 96d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 97d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_UTIL_C_)) 98d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* Compute the smallest power of 2 that is >= x. */ 99d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason EvansJEMALLOC_INLINE size_t 100d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evanspow2_ceil(size_t x) 101d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans{ 102d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 103d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x--; 104d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 1; 105d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 2; 106d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 4; 107d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 8; 108d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 16; 109d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#if (LG_SIZEOF_PTR == 3) 110d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 32; 111d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 112d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x++; 113d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans return (x); 114d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} 115d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 116d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* 117d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * Wrapper around malloc_message() that avoids the need for 118d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * je_malloc_message(...) throughout the code. 119d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 120d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason EvansJEMALLOC_INLINE void 121d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansmalloc_write(const char *s) 122d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans{ 123d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 124d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans je_malloc_message(NULL, s); 125d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} 126d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 127d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 128d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 129d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_INLINES */ 130d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 131