util.h revision 2aa7fed9c983d8dcde7c0cacf1b024c966758b88
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 */ 17a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define JEMALLOC_ARG_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#ifndef not_reached 46d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define not_reached() do { \ 47d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug) { \ 48d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf( \ 49d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "<jemalloc>: %s:%d: Unreachable code reached\n", \ 50d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__); \ 51d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 52d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 53d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 54d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 55d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 56d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef not_implemented 57d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define not_implemented() do { \ 58d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug) { \ 59d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_printf("<jemalloc>: %s:%d: Not implemented\n", \ 60d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans __FILE__, __LINE__); \ 61d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans abort(); \ 62d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } \ 63d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 64d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 65d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 6686abd0dcd8e478759fe409d338d11558c4cec427Jason Evans#ifndef assert_not_implemented 67d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#define assert_not_implemented(e) do { \ 68d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans if (config_debug && !(e)) \ 69d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans not_implemented(); \ 70d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} while (0) 7186abd0dcd8e478759fe409d338d11558c4cec427Jason Evans#endif 72d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 736556e28be15d9acd8f3835fb9fad90145e1edbffJason Evans/* Use to assert a particular configuration, e.g., cassert(config_debug). */ 746556e28be15d9acd8f3835fb9fad90145e1edbffJason Evans#define cassert(c) do { \ 756556e28be15d9acd8f3835fb9fad90145e1edbffJason Evans if ((c) == false) \ 766556e28be15d9acd8f3835fb9fad90145e1edbffJason Evans not_reached(); \ 776556e28be15d9acd8f3835fb9fad90145e1edbffJason Evans} while (0) 786556e28be15d9acd8f3835fb9fad90145e1edbffJason Evans 79d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_TYPES */ 80d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 81d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_STRUCTS 82d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 83d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_STRUCTS */ 84d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 85d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_EXTERNS 86d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 872a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansint buferror(int err, char *buf, size_t buflen); 88e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evansuintmax_t malloc_strtoumax(const char *restrict nptr, 89e18c25d23de0e845f0ee7e11d02c1be044738a3cJason Evans char **restrict endptr, int base); 90889ec59bd3ae3190fb715e64d8d15b6a1b47314aJason Evansvoid malloc_write(const char *s); 91d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 92d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* 93d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * malloc_vsnprintf() supports a subset of snprintf(3) that avoids floating 94d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans * point math. 95d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans */ 96d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansint malloc_vsnprintf(char *str, size_t size, const char *format, 97d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans va_list ap); 98d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansint malloc_snprintf(char *str, size_t size, const char *format, ...) 99d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans JEMALLOC_ATTR(format(printf, 3, 4)); 100d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque, 101d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans const char *format, va_list ap); 102d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_cprintf(void (*write)(void *, const char *), void *cbopaque, 103d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans const char *format, ...) JEMALLOC_ATTR(format(printf, 3, 4)); 104d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evansvoid malloc_printf(const char *format, ...) 105d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans JEMALLOC_ATTR(format(printf, 1, 2)); 106d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 107d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_EXTERNS */ 108d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 109d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifdef JEMALLOC_H_INLINES 110d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 111d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#ifndef JEMALLOC_ENABLE_INLINE 1122aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamondint jemalloc_ffsl(long bitmap); 1132aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamondint jemalloc_ffs(int bitmap); 114d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evanssize_t pow2_ceil(size_t x); 1158d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evanssize_t lg_floor(size_t x); 116a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyvoid set_errno(int errnum); 117a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyint get_errno(void); 118d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 119d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 120d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_UTIL_C_)) 1212aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond 1222aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond/* Sanity check: */ 1232aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond#if !defined(JEMALLOC_INTERNAL_FFSL) || !defined(JEMALLOC_INTERNAL_FFS) 1242aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond# error Both JEMALLOC_INTERNAL_FFSL && JEMALLOC_INTERNAL_FFS should have been defined by configure 1252aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond#endif 1262aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond 1272aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard DiamondJEMALLOC_ALWAYS_INLINE int 1282aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamondjemalloc_ffsl(long bitmap) 1292aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond{ 1302aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond 1312aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond return (JEMALLOC_INTERNAL_FFSL(bitmap)); 1322aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond} 1332aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond 1342aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard DiamondJEMALLOC_ALWAYS_INLINE int 1352aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamondjemalloc_ffs(int bitmap) 1362aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond{ 1372aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond 1382aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond return (JEMALLOC_INTERNAL_FFS(bitmap)); 1392aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond} 1402aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond 141d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/* Compute the smallest power of 2 that is >= x. */ 142d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason EvansJEMALLOC_INLINE size_t 143d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evanspow2_ceil(size_t x) 144d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans{ 145d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 146d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x--; 147d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 1; 148d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 2; 149d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 4; 150d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 8; 151d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 16; 152d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#if (LG_SIZEOF_PTR == 3) 153d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x |= x >> 32; 154d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 155d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans x++; 156d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans return (x); 157d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans} 158d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 1598d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#if (defined(__i386__) || defined(__amd64__) || defined(__x86_64__)) 1608d8f9aeeaa77514d5732db5bd0111232af21fcfdJason EvansJEMALLOC_INLINE size_t 1618d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evanslg_floor(size_t x) 1628d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans{ 1638d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans size_t ret; 1648d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans 1658d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans asm ("bsr %1, %0" 1668d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans : "=r"(ret) // Outputs. 1678d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans : "r"(x) // Inputs. 1688d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans ); 1698d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans return (ret); 1708d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans} 1718d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#elif (defined(JEMALLOC_HAVE_BUILTIN_CLZ)) 1728d8f9aeeaa77514d5732db5bd0111232af21fcfdJason EvansJEMALLOC_INLINE size_t 1738d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evanslg_floor(size_t x) 1748d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans{ 1758d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans 1768d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#if (LG_SIZEOF_PTR == LG_SIZEOF_INT) 17715cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans return (((8 << LG_SIZEOF_PTR) - 1) - __builtin_clz(x)); 1788d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#elif (LG_SIZEOF_PTR == LG_SIZEOF_LONG) 17915cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans return (((8 << LG_SIZEOF_PTR) - 1) - __builtin_clzl(x)); 1808d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#else 1818d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans# error "Unsupported type sizes for lg_floor()" 1828d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#endif 1838d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans} 1848d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#else 1858d8f9aeeaa77514d5732db5bd0111232af21fcfdJason EvansJEMALLOC_INLINE size_t 1868d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evanslg_floor(size_t x) 1878d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans{ 1888d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans 18915cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x |= (x >> 1); 19015cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x |= (x >> 2); 19115cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x |= (x >> 4); 19215cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x |= (x >> 8); 19315cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x |= (x >> 16); 1948d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#if (LG_SIZEOF_PTR == 3 && LG_SIZEOF_PTR == LG_SIZEOF_LONG) 19515cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x |= (x >> 32); 19615cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans if (x == KZU(0xffffffffffffffff)) 19715cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans return (63); 19815cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x++; 1992aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond return (jemalloc_ffsl(x) - 2); 2008d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#elif (LG_SIZEOF_PTR == 2) 20115cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans if (x == KZU(0xffffffff)) 20215cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans return (31); 20315cb17e8aad6afb887ec15c162f357695658bdf6Jason Evans x++; 2042aa7fed9c983d8dcde7c0cacf1b024c966758b88Richard Diamond return (jemalloc_ffs(x) - 2); 2058d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#else 2068d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans# error "Unsupported type sizes for lg_floor()" 2078d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#endif 2088d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans} 2098d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans#endif 2108d8f9aeeaa77514d5732db5bd0111232af21fcfdJason Evans 211a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey/* Sets error code */ 212a14bce85e885f83c96116cc5438ae52d740f3727Mike HommeyJEMALLOC_INLINE void 213a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyset_errno(int errnum) 214a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey{ 215a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey 216a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#ifdef _WIN32 217a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey SetLastError(errnum); 218a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#else 219a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey errno = errnum; 220a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#endif 221a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey} 222a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey 223a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey/* Get last error code */ 224a14bce85e885f83c96116cc5438ae52d740f3727Mike HommeyJEMALLOC_INLINE int 225a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommeyget_errno(void) 226a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey{ 227a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey 228a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#ifdef _WIN32 2297cdea3973cab8640d1f44c7638ed5e30ed18be24Mike Hommey return (GetLastError()); 230a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#else 2317cdea3973cab8640d1f44c7638ed5e30ed18be24Mike Hommey return (errno); 232a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey#endif 233a14bce85e885f83c96116cc5438ae52d740f3727Mike Hommey} 234d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif 235d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans 236d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans#endif /* JEMALLOC_H_INLINES */ 237d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans/******************************************************************************/ 238