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