util.h revision 7cdea3973cab8640d1f44c7638ed5e30ed18be24
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/* 8cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans * Size of stack-allocated buffer used by malloc_{,v,vc}printf(). This must be 9cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans * large enough for all possible uses within jemalloc. 10824d34e5b7f5cf00bf472ec79f7ec1c6e3474114Jason Evans */ 11824d34e5b7f5cf00bf472ec79f7ec1c6e3474114Jason Evans#define MALLOC_PRINTF_BUFSIZE 4096 12824d34e5b7f5cf00bf472ec79f7ec1c6e3474114Jason Evans 13824d34e5b7f5cf00bf472ec79f7ec1c6e3474114Jason Evans/* 14cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans * Wrap a cpp argument that contains commas such that it isn't broken up into 15cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans * multiple arguments. 16cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans */ 17cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans#define JEMALLOC_CONCAT(...) __VA_ARGS__ 18cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans 19cd9a1346e96f71bdecdc654ea50fc62d76371e74Jason Evans/* 209225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans * Silence compiler warnings due to uninitialized values. This is used 219225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans * wherever the compiler fails to recognize that the variable is never used 229225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans * uninitialized. 239225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans */ 249225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans#ifdef JEMALLOC_CC_SILENCE 259225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans# define JEMALLOC_CC_SILENCE_INIT(v) = v 269225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans#else 279225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans# define JEMALLOC_CC_SILENCE_INIT(v) 289225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans#endif 299225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans 309225a1991a58190207cca2ff3cdba966bb322dd5Jason Evans/* 31d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * Define a custom assert() in order to reduce the chances of deadlock during 32d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * assertion failure. 33d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 34d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef assert 35d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define assert(e) do { \ 36d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug && !(e)) { \ 37d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf( \ 38d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "<jemalloc>: %s:%d: Failed assertion: \"%s\"\n", \ 39d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__, #e); \ 40d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 41d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 42d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 43d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 44d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 45d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* Use to assert a particular configuration, e.g., cassert(config_debug). */ 46d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define cassert(c) do { \ 47d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if ((c) == false) \ 48d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans assert(false); \ 49d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 50d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 51d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef not_reached 52d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define not_reached() do { \ 53d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug) { \ 54d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf( \ 55d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "<jemalloc>: %s:%d: Unreachable code reached\n", \ 56d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__); \ 57d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 58d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 59d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 60d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 61d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 62d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef not_implemented 63d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define not_implemented() do { \ 64d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug) { \ 65d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf("<jemalloc>: %s:%d: Not implemented\n", \ 66d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__); \ 67d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 68d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 69d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 70d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 71d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 72d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define assert_not_implemented(e) do { \ 73d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug && !(e)) \ 74d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans not_implemented(); \ 75d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 76d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 77d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_TYPES */ 78d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 79d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_STRUCTS 80d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 81d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_STRUCTS */ 82d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 83d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_EXTERNS 84d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 85d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansextern void (*je_malloc_message)(void *wcbopaque, const char *s); 86d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 87a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyint buferror(char *buf, size_t buflen); 8841b6afb834b1f5250223678c52bd4f013d4234f6Jason Evansuintmax_t malloc_strtoumax(const char *nptr, char **endptr, int base); 89d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 90d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* 91d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * malloc_vsnprintf() supports a subset of snprintf(3) that avoids floating 92d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * point math. 93d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 94d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansint malloc_vsnprintf(char *str, size_t size, const char *format, 95d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans va_list ap); 96d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansint malloc_snprintf(char *str, size_t size, const char *format, ...) 97d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans JEMALLOC_ATTR(format(printf, 3, 4)); 98d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque, 99d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans const char *format, va_list ap); 100d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_cprintf(void (*write)(void *, const char *), void *cbopaque, 101d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans const char *format, ...) JEMALLOC_ATTR(format(printf, 3, 4)); 102d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_printf(const char *format, ...) 103d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans JEMALLOC_ATTR(format(printf, 1, 2)); 104d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 105d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_EXTERNS */ 106d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 107d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_INLINES 108d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 109d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef JEMALLOC_ENABLE_INLINE 110d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evanssize_t pow2_ceil(size_t x); 111d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_write(const char *s); 112a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyvoid set_errno(int errnum); 113a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyint get_errno(void); 114d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 115d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 116d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_UTIL_C_)) 117d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* Compute the smallest power of 2 that is >= x. */ 118d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason EvansJEMALLOC_INLINE size_t 119d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evanspow2_ceil(size_t x) 120d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans{ 121d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 122d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x--; 123d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 1; 124d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 2; 125d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 4; 126d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 8; 127d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 16; 128d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#if (LG_SIZEOF_PTR == 3) 129d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 32; 130d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 131d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x++; 132d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans return (x); 133d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} 134d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 135d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* 136d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * Wrapper around malloc_message() that avoids the need for 137d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * je_malloc_message(...) throughout the code. 138d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 139d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason EvansJEMALLOC_INLINE void 140d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansmalloc_write(const char *s) 141d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans{ 142d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 143d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans je_malloc_message(NULL, s); 144d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} 145a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey 146a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey/* Sets error code */ 147a14bce85e885f83c96116cc5438ae52d740f3727Mike HommeyJEMALLOC_INLINE void 148a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyset_errno(int errnum) 149a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey{ 150a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey 151a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#ifdef _WIN32 152a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey SetLastError(errnum); 153a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#else 154a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey errno = errnum; 155a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#endif 156a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey} 157a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey 158a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey/* Get last error code */ 159a14bce85e885f83c96116cc5438ae52d740f3727Mike HommeyJEMALLOC_INLINE int 160a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyget_errno(void) 161a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey{ 162a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey 163a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#ifdef _WIN32 1647cdea3973cab8640d1f44c7638ed5e30ed18be24Mike Hommey return (GetLastError()); 165a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#else 1667cdea3973cab8640d1f44c7638ed5e30ed18be24Mike Hommey return (errno); 167a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#endif 168a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey} 169d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 170d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 171d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_INLINES */ 172d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 173