Disentangle assert and util
This is the first header refactoring diff, #533. It splits the assert and util components into separate, hermetic, header files. In the process, it splits out two of the large sub-components of util (the stdio.h replacement, and bit manipulation routines) into their own components (malloc_io.h and bit_util.h). This is mostly to break up cyclic dependencies, but it also breaks off a good chunk of the catch-all-ness of util, which is nice.
This commit is contained in:
parent
04d8fcb745
commit
e9852b5776
@ -99,6 +99,7 @@ C_SRCS := $(srcroot)src/jemalloc.c \
|
|||||||
$(srcroot)src/extent_mmap.c \
|
$(srcroot)src/extent_mmap.c \
|
||||||
$(srcroot)src/hash.c \
|
$(srcroot)src/hash.c \
|
||||||
$(srcroot)src/large.c \
|
$(srcroot)src/large.c \
|
||||||
|
$(srcroot)src/malloc_io.c \
|
||||||
$(srcroot)src/mutex.c \
|
$(srcroot)src/mutex.c \
|
||||||
$(srcroot)src/nstime.c \
|
$(srcroot)src/nstime.c \
|
||||||
$(srcroot)src/pages.c \
|
$(srcroot)src/pages.c \
|
||||||
@ -110,7 +111,6 @@ C_SRCS := $(srcroot)src/jemalloc.c \
|
|||||||
$(srcroot)src/tcache.c \
|
$(srcroot)src/tcache.c \
|
||||||
$(srcroot)src/ticker.c \
|
$(srcroot)src/ticker.c \
|
||||||
$(srcroot)src/tsd.c \
|
$(srcroot)src/tsd.c \
|
||||||
$(srcroot)src/util.c \
|
|
||||||
$(srcroot)src/witness.c
|
$(srcroot)src/witness.c
|
||||||
ifeq ($(enable_zone_allocator), 1)
|
ifeq ($(enable_zone_allocator), 1)
|
||||||
C_SRCS += $(srcroot)src/zone.c
|
C_SRCS += $(srcroot)src/zone.c
|
||||||
@ -147,8 +147,8 @@ ifeq (1, $(link_whole_archive))
|
|||||||
C_UTIL_INTEGRATION_SRCS :=
|
C_UTIL_INTEGRATION_SRCS :=
|
||||||
C_UTIL_CPP_SRCS :=
|
C_UTIL_CPP_SRCS :=
|
||||||
else
|
else
|
||||||
C_UTIL_INTEGRATION_SRCS := $(srcroot)src/nstime.c $(srcroot)src/util.c
|
C_UTIL_INTEGRATION_SRCS := $(srcroot)src/nstime.c $(srcroot)src/malloc_io.c
|
||||||
C_UTIL_CPP_SRCS := $(srcroot)src/nstime.c $(srcroot)src/util.c
|
C_UTIL_CPP_SRCS := $(srcroot)src/nstime.c $(srcroot)src/malloc_io.c
|
||||||
endif
|
endif
|
||||||
TESTS_UNIT := \
|
TESTS_UNIT := \
|
||||||
$(srcroot)test/unit/a0.c \
|
$(srcroot)test/unit/a0.c \
|
||||||
@ -165,6 +165,7 @@ TESTS_UNIT := \
|
|||||||
$(srcroot)test/unit/junk_alloc.c \
|
$(srcroot)test/unit/junk_alloc.c \
|
||||||
$(srcroot)test/unit/junk_free.c \
|
$(srcroot)test/unit/junk_free.c \
|
||||||
$(srcroot)test/unit/mallctl.c \
|
$(srcroot)test/unit/mallctl.c \
|
||||||
|
$(srcroot)test/unit/malloc_io.c \
|
||||||
$(srcroot)test/unit/math.c \
|
$(srcroot)test/unit/math.c \
|
||||||
$(srcroot)test/unit/mq.c \
|
$(srcroot)test/unit/mq.c \
|
||||||
$(srcroot)test/unit/mtx.c \
|
$(srcroot)test/unit/mtx.c \
|
||||||
@ -193,7 +194,6 @@ TESTS_UNIT := \
|
|||||||
$(srcroot)test/unit/ticker.c \
|
$(srcroot)test/unit/ticker.c \
|
||||||
$(srcroot)test/unit/nstime.c \
|
$(srcroot)test/unit/nstime.c \
|
||||||
$(srcroot)test/unit/tsd.c \
|
$(srcroot)test/unit/tsd.c \
|
||||||
$(srcroot)test/unit/util.c \
|
|
||||||
$(srcroot)test/unit/witness.c \
|
$(srcroot)test/unit/witness.c \
|
||||||
$(srcroot)test/unit/zero.c
|
$(srcroot)test/unit/zero.c
|
||||||
ifeq (@enable_prof@, 1)
|
ifeq (@enable_prof@, 1)
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
#include "jemalloc/internal/malloc_io.h"
|
||||||
|
#include "jemalloc/internal/util.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define a custom assert() in order to reduce the chances of deadlock during
|
* Define a custom assert() in order to reduce the chances of deadlock during
|
||||||
* assertion failure.
|
* assertion failure.
|
||||||
@ -43,4 +46,11 @@
|
|||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Use to assert a particular configuration, e.g., cassert(config_debug). */
|
||||||
|
#ifndef cassert
|
||||||
|
#define cassert(c) do { \
|
||||||
|
if (unlikely(!(c))) { \
|
||||||
|
not_reached(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
@ -1,22 +1,9 @@
|
|||||||
#ifndef JEMALLOC_INTERNAL_UTIL_INLINES_H
|
#ifndef JEMALLOC_INTERNAL_BIT_UTIL_H
|
||||||
#define JEMALLOC_INTERNAL_UTIL_INLINES_H
|
#define JEMALLOC_INTERNAL_BIT_UTIL_H
|
||||||
|
|
||||||
#ifndef JEMALLOC_ENABLE_INLINE
|
#include "jemalloc/internal/assert.h"
|
||||||
unsigned ffs_llu(unsigned long long bitmap);
|
|
||||||
unsigned ffs_lu(unsigned long bitmap);
|
|
||||||
unsigned ffs_u(unsigned bitmap);
|
|
||||||
unsigned ffs_zu(size_t bitmap);
|
|
||||||
unsigned ffs_u64(uint64_t bitmap);
|
|
||||||
unsigned ffs_u32(uint32_t bitmap);
|
|
||||||
uint64_t pow2_ceil_u64(uint64_t x);
|
|
||||||
uint32_t pow2_ceil_u32(uint32_t x);
|
|
||||||
size_t pow2_ceil_zu(size_t x);
|
|
||||||
unsigned lg_floor(size_t x);
|
|
||||||
void set_errno(int errnum);
|
|
||||||
int get_errno(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_UTIL_C_))
|
#define BIT_UTIL_INLINE static inline
|
||||||
|
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
#if !defined(JEMALLOC_INTERNAL_FFSLL) || !defined(JEMALLOC_INTERNAL_FFSL) \
|
#if !defined(JEMALLOC_INTERNAL_FFSLL) || !defined(JEMALLOC_INTERNAL_FFSL) \
|
||||||
@ -24,22 +11,23 @@ int get_errno(void);
|
|||||||
# error JEMALLOC_INTERNAL_FFS{,L,LL} should have been defined by configure
|
# error JEMALLOC_INTERNAL_FFS{,L,LL} should have been defined by configure
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE unsigned
|
|
||||||
|
BIT_UTIL_INLINE unsigned
|
||||||
ffs_llu(unsigned long long bitmap) {
|
ffs_llu(unsigned long long bitmap) {
|
||||||
return JEMALLOC_INTERNAL_FFSLL(bitmap);
|
return JEMALLOC_INTERNAL_FFSLL(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
ffs_lu(unsigned long bitmap) {
|
ffs_lu(unsigned long bitmap) {
|
||||||
return JEMALLOC_INTERNAL_FFSL(bitmap);
|
return JEMALLOC_INTERNAL_FFSL(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
ffs_u(unsigned bitmap) {
|
ffs_u(unsigned bitmap) {
|
||||||
return JEMALLOC_INTERNAL_FFS(bitmap);
|
return JEMALLOC_INTERNAL_FFS(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
ffs_zu(size_t bitmap) {
|
ffs_zu(size_t bitmap) {
|
||||||
#if LG_SIZEOF_PTR == LG_SIZEOF_INT
|
#if LG_SIZEOF_PTR == LG_SIZEOF_INT
|
||||||
return ffs_u(bitmap);
|
return ffs_u(bitmap);
|
||||||
@ -52,7 +40,7 @@ ffs_zu(size_t bitmap) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
ffs_u64(uint64_t bitmap) {
|
ffs_u64(uint64_t bitmap) {
|
||||||
#if LG_SIZEOF_LONG == 3
|
#if LG_SIZEOF_LONG == 3
|
||||||
return ffs_lu(bitmap);
|
return ffs_lu(bitmap);
|
||||||
@ -63,7 +51,7 @@ ffs_u64(uint64_t bitmap) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
ffs_u32(uint32_t bitmap) {
|
ffs_u32(uint32_t bitmap) {
|
||||||
#if LG_SIZEOF_INT == 2
|
#if LG_SIZEOF_INT == 2
|
||||||
return ffs_u(bitmap);
|
return ffs_u(bitmap);
|
||||||
@ -73,7 +61,7 @@ ffs_u32(uint32_t bitmap) {
|
|||||||
return ffs_u(bitmap);
|
return ffs_u(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_INLINE uint64_t
|
BIT_UTIL_INLINE uint64_t
|
||||||
pow2_ceil_u64(uint64_t x) {
|
pow2_ceil_u64(uint64_t x) {
|
||||||
x--;
|
x--;
|
||||||
x |= x >> 1;
|
x |= x >> 1;
|
||||||
@ -86,7 +74,7 @@ pow2_ceil_u64(uint64_t x) {
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_INLINE uint32_t
|
BIT_UTIL_INLINE uint32_t
|
||||||
pow2_ceil_u32(uint32_t x) {
|
pow2_ceil_u32(uint32_t x) {
|
||||||
x--;
|
x--;
|
||||||
x |= x >> 1;
|
x |= x >> 1;
|
||||||
@ -99,7 +87,7 @@ pow2_ceil_u32(uint32_t x) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the smallest power of 2 that is >= x. */
|
/* Compute the smallest power of 2 that is >= x. */
|
||||||
JEMALLOC_INLINE size_t
|
BIT_UTIL_INLINE size_t
|
||||||
pow2_ceil_zu(size_t x) {
|
pow2_ceil_zu(size_t x) {
|
||||||
#if (LG_SIZEOF_PTR == 3)
|
#if (LG_SIZEOF_PTR == 3)
|
||||||
return pow2_ceil_u64(x);
|
return pow2_ceil_u64(x);
|
||||||
@ -109,10 +97,9 @@ pow2_ceil_zu(size_t x) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(__i386__) || defined(__amd64__) || defined(__x86_64__))
|
#if (defined(__i386__) || defined(__amd64__) || defined(__x86_64__))
|
||||||
JEMALLOC_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
lg_floor(size_t x) {
|
lg_floor(size_t x) {
|
||||||
size_t ret;
|
size_t ret;
|
||||||
|
|
||||||
assert(x != 0);
|
assert(x != 0);
|
||||||
|
|
||||||
asm ("bsr %1, %0"
|
asm ("bsr %1, %0"
|
||||||
@ -123,7 +110,7 @@ lg_floor(size_t x) {
|
|||||||
return (unsigned)ret;
|
return (unsigned)ret;
|
||||||
}
|
}
|
||||||
#elif (defined(_MSC_VER))
|
#elif (defined(_MSC_VER))
|
||||||
JEMALLOC_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
lg_floor(size_t x) {
|
lg_floor(size_t x) {
|
||||||
unsigned long ret;
|
unsigned long ret;
|
||||||
|
|
||||||
@ -140,7 +127,7 @@ lg_floor(size_t x) {
|
|||||||
return (unsigned)ret;
|
return (unsigned)ret;
|
||||||
}
|
}
|
||||||
#elif (defined(JEMALLOC_HAVE_BUILTIN_CLZ))
|
#elif (defined(JEMALLOC_HAVE_BUILTIN_CLZ))
|
||||||
JEMALLOC_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
lg_floor(size_t x) {
|
lg_floor(size_t x) {
|
||||||
assert(x != 0);
|
assert(x != 0);
|
||||||
|
|
||||||
@ -153,7 +140,7 @@ lg_floor(size_t x) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
JEMALLOC_INLINE unsigned
|
BIT_UTIL_INLINE unsigned
|
||||||
lg_floor(size_t x) {
|
lg_floor(size_t x) {
|
||||||
assert(x != 0);
|
assert(x != 0);
|
||||||
|
|
||||||
@ -173,25 +160,6 @@ lg_floor(size_t x) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set error code. */
|
#undef BIT_UTIL_INLINE
|
||||||
JEMALLOC_INLINE void
|
|
||||||
set_errno(int errnum) {
|
|
||||||
#ifdef _WIN32
|
|
||||||
SetLastError(errnum);
|
|
||||||
#else
|
|
||||||
errno = errnum;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get last error code. */
|
#endif /* JEMALLOC_INTERNAL_BIT_UTIL_H */
|
||||||
JEMALLOC_INLINE int
|
|
||||||
get_errno(void) {
|
|
||||||
#ifdef _WIN32
|
|
||||||
return GetLastError();
|
|
||||||
#else
|
|
||||||
return errno;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_UTIL_INLINES_H */
|
|
@ -204,7 +204,11 @@ static const bool have_thp =
|
|||||||
/* HERMETIC HEADERS */
|
/* HERMETIC HEADERS */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#include "jemalloc/internal/assert.h"
|
||||||
#include "jemalloc/internal/atomic.h"
|
#include "jemalloc/internal/atomic.h"
|
||||||
|
#include "jemalloc/internal/bit_util.h"
|
||||||
|
#include "jemalloc/internal/malloc_io.h"
|
||||||
|
#include "jemalloc/internal/util.h"
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* TYPES */
|
/* TYPES */
|
||||||
@ -382,7 +386,6 @@ typedef unsigned szind_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "jemalloc/internal/nstime_types.h"
|
#include "jemalloc/internal/nstime_types.h"
|
||||||
#include "jemalloc/internal/util_types.h"
|
|
||||||
#include "jemalloc/internal/spin_types.h"
|
#include "jemalloc/internal/spin_types.h"
|
||||||
#include "jemalloc/internal/prng_types.h"
|
#include "jemalloc/internal/prng_types.h"
|
||||||
#include "jemalloc/internal/ticker_types.h"
|
#include "jemalloc/internal/ticker_types.h"
|
||||||
@ -490,7 +493,6 @@ void jemalloc_postfork_parent(void);
|
|||||||
void jemalloc_postfork_child(void);
|
void jemalloc_postfork_child(void);
|
||||||
|
|
||||||
#include "jemalloc/internal/nstime_externs.h"
|
#include "jemalloc/internal/nstime_externs.h"
|
||||||
#include "jemalloc/internal/util_externs.h"
|
|
||||||
#include "jemalloc/internal/ckh_externs.h"
|
#include "jemalloc/internal/ckh_externs.h"
|
||||||
#include "jemalloc/internal/stats_externs.h"
|
#include "jemalloc/internal/stats_externs.h"
|
||||||
#include "jemalloc/internal/ctl_externs.h"
|
#include "jemalloc/internal/ctl_externs.h"
|
||||||
@ -513,7 +515,6 @@ void jemalloc_postfork_child(void);
|
|||||||
/* INLINES */
|
/* INLINES */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
#include "jemalloc/internal/util_inlines.h"
|
|
||||||
#include "jemalloc/internal/spin_inlines.h"
|
#include "jemalloc/internal/spin_inlines.h"
|
||||||
#include "jemalloc/internal/prng_inlines.h"
|
#include "jemalloc/internal/prng_inlines.h"
|
||||||
#include "jemalloc/internal/ticker_inlines.h"
|
#include "jemalloc/internal/ticker_inlines.h"
|
||||||
|
63
include/jemalloc/internal/malloc_io.h
Normal file
63
include/jemalloc/internal/malloc_io.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#ifndef JEMALLOC_INTERNAL_MALLOC_IO_H
|
||||||
|
#define JEMALLOC_INTERNAL_MALLOC_IO_H
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# ifdef _WIN64
|
||||||
|
# define FMT64_PREFIX "ll"
|
||||||
|
# define FMTPTR_PREFIX "ll"
|
||||||
|
# else
|
||||||
|
# define FMT64_PREFIX "ll"
|
||||||
|
# define FMTPTR_PREFIX ""
|
||||||
|
# endif
|
||||||
|
# define FMTd32 "d"
|
||||||
|
# define FMTu32 "u"
|
||||||
|
# define FMTx32 "x"
|
||||||
|
# define FMTd64 FMT64_PREFIX "d"
|
||||||
|
# define FMTu64 FMT64_PREFIX "u"
|
||||||
|
# define FMTx64 FMT64_PREFIX "x"
|
||||||
|
# define FMTdPTR FMTPTR_PREFIX "d"
|
||||||
|
# define FMTuPTR FMTPTR_PREFIX "u"
|
||||||
|
# define FMTxPTR FMTPTR_PREFIX "x"
|
||||||
|
#else
|
||||||
|
# include <inttypes.h>
|
||||||
|
# define FMTd32 PRId32
|
||||||
|
# define FMTu32 PRIu32
|
||||||
|
# define FMTx32 PRIx32
|
||||||
|
# define FMTd64 PRId64
|
||||||
|
# define FMTu64 PRIu64
|
||||||
|
# define FMTx64 PRIx64
|
||||||
|
# define FMTdPTR PRIdPTR
|
||||||
|
# define FMTuPTR PRIuPTR
|
||||||
|
# define FMTxPTR PRIxPTR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Size of stack-allocated buffer passed to buferror(). */
|
||||||
|
#define BUFERROR_BUF 64
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Size of stack-allocated buffer used by malloc_{,v,vc}printf(). This must be
|
||||||
|
* large enough for all possible uses within jemalloc.
|
||||||
|
*/
|
||||||
|
#define MALLOC_PRINTF_BUFSIZE 4096
|
||||||
|
|
||||||
|
|
||||||
|
int buferror(int err, char *buf, size_t buflen);
|
||||||
|
uintmax_t malloc_strtoumax(const char *restrict nptr, char **restrict endptr,
|
||||||
|
int base);
|
||||||
|
void malloc_write(const char *s);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* malloc_vsnprintf() supports a subset of snprintf(3) that avoids floating
|
||||||
|
* point math.
|
||||||
|
*/
|
||||||
|
size_t malloc_vsnprintf(char *str, size_t size, const char *format,
|
||||||
|
va_list ap);
|
||||||
|
size_t malloc_snprintf(char *str, size_t size, const char *format, ...)
|
||||||
|
JEMALLOC_FORMAT_PRINTF(3, 4);
|
||||||
|
void malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque,
|
||||||
|
const char *format, va_list ap);
|
||||||
|
void malloc_cprintf(void (*write)(void *, const char *), void *cbopaque,
|
||||||
|
const char *format, ...) JEMALLOC_FORMAT_PRINTF(3, 4);
|
||||||
|
void malloc_printf(const char *format, ...) JEMALLOC_FORMAT_PRINTF(1, 2);
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_INTERNAL_MALLOC_IO_H */
|
71
include/jemalloc/internal/util.h
Normal file
71
include/jemalloc/internal/util.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#ifndef JEMALLOC_INTERNAL_UTIL_H
|
||||||
|
#define JEMALLOC_INTERNAL_UTIL_H
|
||||||
|
|
||||||
|
#define UTIL_INLINE static inline
|
||||||
|
|
||||||
|
/* Junk fill patterns. */
|
||||||
|
#ifndef JEMALLOC_ALLOC_JUNK
|
||||||
|
# define JEMALLOC_ALLOC_JUNK ((uint8_t)0xa5)
|
||||||
|
#endif
|
||||||
|
#ifndef JEMALLOC_FREE_JUNK
|
||||||
|
# define JEMALLOC_FREE_JUNK ((uint8_t)0x5a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wrap a cpp argument that contains commas such that it isn't broken up into
|
||||||
|
* multiple arguments.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_ARG_CONCAT(...) __VA_ARGS__
|
||||||
|
|
||||||
|
/* cpp macro definition stringification. */
|
||||||
|
#define STRINGIFY_HELPER(x) #x
|
||||||
|
#define STRINGIFY(x) STRINGIFY_HELPER(x)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Silence compiler warnings due to uninitialized values. This is used
|
||||||
|
* wherever the compiler fails to recognize that the variable is never used
|
||||||
|
* uninitialized.
|
||||||
|
*/
|
||||||
|
#ifdef JEMALLOC_CC_SILENCE
|
||||||
|
# define JEMALLOC_CC_SILENCE_INIT(v) = v
|
||||||
|
#else
|
||||||
|
# define JEMALLOC_CC_SILENCE_INIT(v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define likely(x) __builtin_expect(!!(x), 1)
|
||||||
|
# define unlikely(x) __builtin_expect(!!(x), 0)
|
||||||
|
#else
|
||||||
|
# define likely(x) !!(x)
|
||||||
|
# define unlikely(x) !!(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(JEMALLOC_INTERNAL_UNREACHABLE)
|
||||||
|
# error JEMALLOC_INTERNAL_UNREACHABLE should have been defined by configure
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define unreachable() JEMALLOC_INTERNAL_UNREACHABLE()
|
||||||
|
|
||||||
|
/* Set error code. */
|
||||||
|
UTIL_INLINE void
|
||||||
|
set_errno(int errnum) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
SetLastError(errnum);
|
||||||
|
#else
|
||||||
|
errno = errnum;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get last error code. */
|
||||||
|
UTIL_INLINE int
|
||||||
|
get_errno(void) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
return GetLastError();
|
||||||
|
#else
|
||||||
|
return errno;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef UTIL_INLINE
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_INTERNAL_UTIL_H */
|
@ -1,23 +0,0 @@
|
|||||||
#ifndef JEMALLOC_INTERNAL_UTIL_EXTERNS_H
|
|
||||||
#define JEMALLOC_INTERNAL_UTIL_EXTERNS_H
|
|
||||||
|
|
||||||
int buferror(int err, char *buf, size_t buflen);
|
|
||||||
uintmax_t malloc_strtoumax(const char *restrict nptr,
|
|
||||||
char **restrict endptr, int base);
|
|
||||||
void malloc_write(const char *s);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* malloc_vsnprintf() supports a subset of snprintf(3) that avoids floating
|
|
||||||
* point math.
|
|
||||||
*/
|
|
||||||
size_t malloc_vsnprintf(char *str, size_t size, const char *format,
|
|
||||||
va_list ap);
|
|
||||||
size_t malloc_snprintf(char *str, size_t size, const char *format, ...)
|
|
||||||
JEMALLOC_FORMAT_PRINTF(3, 4);
|
|
||||||
void malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque,
|
|
||||||
const char *format, va_list ap);
|
|
||||||
void malloc_cprintf(void (*write)(void *, const char *), void *cbopaque,
|
|
||||||
const char *format, ...) JEMALLOC_FORMAT_PRINTF(3, 4);
|
|
||||||
void malloc_printf(const char *format, ...) JEMALLOC_FORMAT_PRINTF(1, 2);
|
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_UTIL_EXTERNS_H */
|
|
@ -1,95 +0,0 @@
|
|||||||
#ifndef JEMALLOC_INTERNAL_UTIL_TYPES_H
|
|
||||||
#define JEMALLOC_INTERNAL_UTIL_TYPES_H
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# ifdef _WIN64
|
|
||||||
# define FMT64_PREFIX "ll"
|
|
||||||
# define FMTPTR_PREFIX "ll"
|
|
||||||
# else
|
|
||||||
# define FMT64_PREFIX "ll"
|
|
||||||
# define FMTPTR_PREFIX ""
|
|
||||||
# endif
|
|
||||||
# define FMTd32 "d"
|
|
||||||
# define FMTu32 "u"
|
|
||||||
# define FMTx32 "x"
|
|
||||||
# define FMTd64 FMT64_PREFIX "d"
|
|
||||||
# define FMTu64 FMT64_PREFIX "u"
|
|
||||||
# define FMTx64 FMT64_PREFIX "x"
|
|
||||||
# define FMTdPTR FMTPTR_PREFIX "d"
|
|
||||||
# define FMTuPTR FMTPTR_PREFIX "u"
|
|
||||||
# define FMTxPTR FMTPTR_PREFIX "x"
|
|
||||||
#else
|
|
||||||
# include <inttypes.h>
|
|
||||||
# define FMTd32 PRId32
|
|
||||||
# define FMTu32 PRIu32
|
|
||||||
# define FMTx32 PRIx32
|
|
||||||
# define FMTd64 PRId64
|
|
||||||
# define FMTu64 PRIu64
|
|
||||||
# define FMTx64 PRIx64
|
|
||||||
# define FMTdPTR PRIdPTR
|
|
||||||
# define FMTuPTR PRIuPTR
|
|
||||||
# define FMTxPTR PRIxPTR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Size of stack-allocated buffer passed to buferror(). */
|
|
||||||
#define BUFERROR_BUF 64
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Size of stack-allocated buffer used by malloc_{,v,vc}printf(). This must be
|
|
||||||
* large enough for all possible uses within jemalloc.
|
|
||||||
*/
|
|
||||||
#define MALLOC_PRINTF_BUFSIZE 4096
|
|
||||||
|
|
||||||
/* Junk fill patterns. */
|
|
||||||
#ifndef JEMALLOC_ALLOC_JUNK
|
|
||||||
# define JEMALLOC_ALLOC_JUNK ((uint8_t)0xa5)
|
|
||||||
#endif
|
|
||||||
#ifndef JEMALLOC_FREE_JUNK
|
|
||||||
# define JEMALLOC_FREE_JUNK ((uint8_t)0x5a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wrap a cpp argument that contains commas such that it isn't broken up into
|
|
||||||
* multiple arguments.
|
|
||||||
*/
|
|
||||||
#define JEMALLOC_ARG_CONCAT(...) __VA_ARGS__
|
|
||||||
|
|
||||||
/* cpp macro definition stringification. */
|
|
||||||
#define STRINGIFY_HELPER(x) #x
|
|
||||||
#define STRINGIFY(x) STRINGIFY_HELPER(x)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Silence compiler warnings due to uninitialized values. This is used
|
|
||||||
* wherever the compiler fails to recognize that the variable is never used
|
|
||||||
* uninitialized.
|
|
||||||
*/
|
|
||||||
#ifdef JEMALLOC_CC_SILENCE
|
|
||||||
# define JEMALLOC_CC_SILENCE_INIT(v) = v
|
|
||||||
#else
|
|
||||||
# define JEMALLOC_CC_SILENCE_INIT(v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define likely(x) __builtin_expect(!!(x), 1)
|
|
||||||
# define unlikely(x) __builtin_expect(!!(x), 0)
|
|
||||||
#else
|
|
||||||
# define likely(x) !!(x)
|
|
||||||
# define unlikely(x) !!(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(JEMALLOC_INTERNAL_UNREACHABLE)
|
|
||||||
# error JEMALLOC_INTERNAL_UNREACHABLE should have been defined by configure
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define unreachable() JEMALLOC_INTERNAL_UNREACHABLE()
|
|
||||||
|
|
||||||
#include "jemalloc/internal/assert.h"
|
|
||||||
|
|
||||||
/* Use to assert a particular configuration, e.g., cassert(config_debug). */
|
|
||||||
#define cassert(c) do { \
|
|
||||||
if (unlikely(!(c))) { \
|
|
||||||
not_reached(); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_UTIL_TYPES_H */
|
|
@ -1,3 +1,19 @@
|
|||||||
|
#define JEMALLOC_MALLOC_IO_C_
|
||||||
|
#include "jemalloc/internal/jemalloc_internal.h"
|
||||||
|
|
||||||
|
#ifdef assert
|
||||||
|
# undef assert
|
||||||
|
#endif
|
||||||
|
#ifdef not_reached
|
||||||
|
# undef not_reached
|
||||||
|
#endif
|
||||||
|
#ifdef not_implemented
|
||||||
|
# undef not_implemented
|
||||||
|
#endif
|
||||||
|
#ifdef assert_not_implemented
|
||||||
|
# undef assert_not_implemented
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define simple versions of assertion macros that won't recurse in case
|
* Define simple versions of assertion macros that won't recurse in case
|
||||||
* of assertion failures in malloc_*printf().
|
* of assertion failures in malloc_*printf().
|
||||||
@ -24,8 +40,11 @@
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define JEMALLOC_UTIL_C_
|
#define assert_not_implemented(e) do { \
|
||||||
#include "jemalloc/internal/jemalloc_internal.h"
|
if (unlikely(config_debug && !(e))) { \
|
||||||
|
not_implemented(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* Function prototypes for non-inline static functions. */
|
/* Function prototypes for non-inline static functions. */
|
||||||
@ -662,4 +681,5 @@ malloc_printf(const char *format, ...) {
|
|||||||
#undef assert
|
#undef assert
|
||||||
#undef not_reached
|
#undef not_reached
|
||||||
#undef not_implemented
|
#undef not_implemented
|
||||||
|
#undef assert_not_implemented
|
||||||
#include "jemalloc/internal/assert.h"
|
#include "jemalloc/internal/assert.h"
|
@ -69,12 +69,15 @@ static const bool config_debug =
|
|||||||
# define JEMALLOC_N(n) @private_namespace@##n
|
# define JEMALLOC_N(n) @private_namespace@##n
|
||||||
# include "jemalloc/internal/private_namespace.h"
|
# include "jemalloc/internal/private_namespace.h"
|
||||||
|
|
||||||
|
/* Hermetic headers. */
|
||||||
|
# include "jemalloc/internal/assert.h"
|
||||||
|
# include "jemalloc/internal/malloc_io.h"
|
||||||
|
# include "jemalloc/internal/util.h"
|
||||||
|
|
||||||
|
/* Non-hermetic headers. */
|
||||||
# include "jemalloc/internal/nstime_types.h"
|
# include "jemalloc/internal/nstime_types.h"
|
||||||
# include "jemalloc/internal/nstime_structs.h"
|
# include "jemalloc/internal/nstime_structs.h"
|
||||||
# include "jemalloc/internal/nstime_externs.h"
|
# include "jemalloc/internal/nstime_externs.h"
|
||||||
# include "jemalloc/internal/util_types.h"
|
|
||||||
# include "jemalloc/internal/util_externs.h"
|
|
||||||
# include "jemalloc/internal/util_inlines.h"
|
|
||||||
# include "jemalloc/internal/qr.h"
|
# include "jemalloc/internal/qr.h"
|
||||||
# include "jemalloc/internal/ql.h"
|
# include "jemalloc/internal/ql.h"
|
||||||
|
|
||||||
|
55
test/unit/bit_util.c
Normal file
55
test/unit/bit_util.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#include "test/jemalloc_test.h"
|
||||||
|
|
||||||
|
#define TEST_POW2_CEIL(t, suf, pri) do { \
|
||||||
|
unsigned i, pow2; \
|
||||||
|
t x; \
|
||||||
|
\
|
||||||
|
assert_##suf##_eq(pow2_ceil_##suf(0), 0, "Unexpected result"); \
|
||||||
|
\
|
||||||
|
for (i = 0; i < sizeof(t) * 8; i++) { \
|
||||||
|
assert_##suf##_eq(pow2_ceil_##suf(((t)1) << i), ((t)1) \
|
||||||
|
<< i, "Unexpected result"); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
for (i = 2; i < sizeof(t) * 8; i++) { \
|
||||||
|
assert_##suf##_eq(pow2_ceil_##suf((((t)1) << i) - 1), \
|
||||||
|
((t)1) << i, "Unexpected result"); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
for (i = 0; i < sizeof(t) * 8 - 1; i++) { \
|
||||||
|
assert_##suf##_eq(pow2_ceil_##suf((((t)1) << i) + 1), \
|
||||||
|
((t)1) << (i+1), "Unexpected result"); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
for (pow2 = 1; pow2 < 25; pow2++) { \
|
||||||
|
for (x = (((t)1) << (pow2-1)) + 1; x <= ((t)1) << pow2; \
|
||||||
|
x++) { \
|
||||||
|
assert_##suf##_eq(pow2_ceil_##suf(x), \
|
||||||
|
((t)1) << pow2, \
|
||||||
|
"Unexpected result, x=%"pri, x); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
TEST_BEGIN(test_pow2_ceil_u64) {
|
||||||
|
TEST_POW2_CEIL(uint64_t, u64, FMTu64);
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
TEST_BEGIN(test_pow2_ceil_u32) {
|
||||||
|
TEST_POW2_CEIL(uint32_t, u32, FMTu32);
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
TEST_BEGIN(test_pow2_ceil_zu) {
|
||||||
|
TEST_POW2_CEIL(size_t, zu, "zu");
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void) {
|
||||||
|
return test(
|
||||||
|
test_pow2_ceil_u64,
|
||||||
|
test_pow2_ceil_u32,
|
||||||
|
test_pow2_ceil_zu);
|
||||||
|
}
|
@ -1,51 +1,5 @@
|
|||||||
#include "test/jemalloc_test.h"
|
#include "test/jemalloc_test.h"
|
||||||
|
|
||||||
#define TEST_POW2_CEIL(t, suf, pri) do { \
|
|
||||||
unsigned i, pow2; \
|
|
||||||
t x; \
|
|
||||||
\
|
|
||||||
assert_##suf##_eq(pow2_ceil_##suf(0), 0, "Unexpected result"); \
|
|
||||||
\
|
|
||||||
for (i = 0; i < sizeof(t) * 8; i++) { \
|
|
||||||
assert_##suf##_eq(pow2_ceil_##suf(((t)1) << i), ((t)1) \
|
|
||||||
<< i, "Unexpected result"); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
for (i = 2; i < sizeof(t) * 8; i++) { \
|
|
||||||
assert_##suf##_eq(pow2_ceil_##suf((((t)1) << i) - 1), \
|
|
||||||
((t)1) << i, "Unexpected result"); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
for (i = 0; i < sizeof(t) * 8 - 1; i++) { \
|
|
||||||
assert_##suf##_eq(pow2_ceil_##suf((((t)1) << i) + 1), \
|
|
||||||
((t)1) << (i+1), "Unexpected result"); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
for (pow2 = 1; pow2 < 25; pow2++) { \
|
|
||||||
for (x = (((t)1) << (pow2-1)) + 1; x <= ((t)1) << pow2; \
|
|
||||||
x++) { \
|
|
||||||
assert_##suf##_eq(pow2_ceil_##suf(x), \
|
|
||||||
((t)1) << pow2, \
|
|
||||||
"Unexpected result, x=%"pri, x); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
TEST_BEGIN(test_pow2_ceil_u64) {
|
|
||||||
TEST_POW2_CEIL(uint64_t, u64, FMTu64);
|
|
||||||
}
|
|
||||||
TEST_END
|
|
||||||
|
|
||||||
TEST_BEGIN(test_pow2_ceil_u32) {
|
|
||||||
TEST_POW2_CEIL(uint32_t, u32, FMTu32);
|
|
||||||
}
|
|
||||||
TEST_END
|
|
||||||
|
|
||||||
TEST_BEGIN(test_pow2_ceil_zu) {
|
|
||||||
TEST_POW2_CEIL(size_t, zu, "zu");
|
|
||||||
}
|
|
||||||
TEST_END
|
|
||||||
|
|
||||||
TEST_BEGIN(test_malloc_strtoumax_no_endptr) {
|
TEST_BEGIN(test_malloc_strtoumax_no_endptr) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -297,9 +251,6 @@ TEST_END
|
|||||||
int
|
int
|
||||||
main(void) {
|
main(void) {
|
||||||
return test(
|
return test(
|
||||||
test_pow2_ceil_u64,
|
|
||||||
test_pow2_ceil_u32,
|
|
||||||
test_pow2_ceil_zu,
|
|
||||||
test_malloc_strtoumax_no_endptr,
|
test_malloc_strtoumax_no_endptr,
|
||||||
test_malloc_strtoumax,
|
test_malloc_strtoumax,
|
||||||
test_malloc_snprintf_truncated,
|
test_malloc_snprintf_truncated,
|
Loading…
Reference in New Issue
Block a user