1/******************************************************************************/
2#ifdef JEMALLOC_H_TYPES
3
4#ifdef JEMALLOC_VALGRIND
5#include <valgrind/valgrind.h>
6
7/*
8 * The size that is reported to Valgrind must be consistent through a chain of
9 * malloc..realloc..realloc calls. Request size isn't recorded anywhere in
10 * jemalloc, so it is critical that all callers of these macros provide usize
11 * rather than request size. As a result, buffer overflow detection is
12 * technically weakened for the standard API, though it is generally accepted
13 * practice to consider any extra bytes reported by malloc_usable_size() as
14 * usable space.
15 */
16#define JEMALLOC_VALGRIND_MAKE_MEM_NOACCESS(ptr, usize) do { \
17 if (unlikely(in_valgrind)) \
18 valgrind_make_mem_noaccess(ptr, usize); \
19} while (0)
20#define JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED(ptr, usize) do { \
21 if (unlikely(in_valgrind)) \
22 valgrind_make_mem_undefined(ptr, usize); \
23} while (0)
24#define JEMALLOC_VALGRIND_MAKE_MEM_DEFINED(ptr, usize) do { \
25 if (unlikely(in_valgrind)) \
26 valgrind_make_mem_defined(ptr, usize); \
27} while (0)
28/*
29 * The VALGRIND_MALLOCLIKE_BLOCK() and VALGRIND_RESIZEINPLACE_BLOCK() macro
30 * calls must be embedded in macros rather than in functions so that when
31 * Valgrind reports errors, there are no extra stack frames in the backtraces.
32 */
33#define JEMALLOC_VALGRIND_MALLOC(cond, tsdn, ptr, usize, zero) do { \
34 if (unlikely(in_valgrind && cond)) { \
35 VALGRIND_MALLOCLIKE_BLOCK(ptr, usize, p2rz(tsdn, ptr), \
36 zero); \
37 } \
38} while (0)
39#define JEMALLOC_VALGRIND_REALLOC(maybe_moved, tsdn, ptr, usize, \
40 ptr_maybe_null, old_ptr, old_usize, old_rzsize, old_ptr_maybe_null, \
41 zero) do { \
42 if (unlikely(in_valgrind)) { \
43 size_t rzsize = p2rz(tsdn, ptr); \
44 \
45 if (!maybe_moved || ptr == old_ptr) { \
46 VALGRIND_RESIZEINPLACE_BLOCK(ptr, old_usize, \
47 usize, rzsize); \
48 if (zero && old_usize < usize) { \
49 valgrind_make_mem_defined( \
50 (void *)((uintptr_t)ptr + \
51 old_usize), usize - old_usize); \
52 } \
53 } else { \
54 if (!old_ptr_maybe_null || old_ptr != NULL) { \
55 valgrind_freelike_block(old_ptr, \
56 old_rzsize); \
57 } \
58 if (!ptr_maybe_null || ptr != NULL) { \
59 size_t copy_size = (old_usize < usize) \
60 ? old_usize : usize; \
61 size_t tail_size = usize - copy_size; \
62 VALGRIND_MALLOCLIKE_BLOCK(ptr, usize, \
63 rzsize, false); \
64 if (copy_size > 0) { \
65 valgrind_make_mem_defined(ptr, \
66 copy_size); \
67 } \
68 if (zero && tail_size > 0) { \
69 valgrind_make_mem_defined( \
70 (void *)((uintptr_t)ptr + \
71 copy_size), tail_size); \
72 } \
73 } \
74 } \
75 } \
76} while (0)
77#define JEMALLOC_VALGRIND_FREE(ptr, rzsize) do { \
78 if (unlikely(in_valgrind)) \
79 valgrind_freelike_block(ptr, rzsize); \
80} while (0)
81#else
82#define RUNNING_ON_VALGRIND ((unsigned)0)
83#define JEMALLOC_VALGRIND_MAKE_MEM_NOACCESS(ptr, usize) do {} while (0)
84#define JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED(ptr, usize) do {} while (0)
85#define JEMALLOC_VALGRIND_MAKE_MEM_DEFINED(ptr, usize) do {} while (0)
86#define JEMALLOC_VALGRIND_MALLOC(cond, tsdn, ptr, usize, zero) do {} while (0)
87#define JEMALLOC_VALGRIND_REALLOC(maybe_moved, tsdn, ptr, usize, \
88 ptr_maybe_null, old_ptr, old_usize, old_rzsize, old_ptr_maybe_null, \
89 zero) do {} while (0)
90#define JEMALLOC_VALGRIND_FREE(ptr, rzsize) do {} while (0)
91#endif
92
93#endif /* JEMALLOC_H_TYPES */
94/******************************************************************************/
95#ifdef JEMALLOC_H_STRUCTS
96
97#endif /* JEMALLOC_H_STRUCTS */
98/******************************************************************************/
99#ifdef JEMALLOC_H_EXTERNS
100
101#ifdef JEMALLOC_VALGRIND
102void valgrind_make_mem_noaccess(void *ptr, size_t usize);
103void valgrind_make_mem_undefined(void *ptr, size_t usize);
104void valgrind_make_mem_defined(void *ptr, size_t usize);
105void valgrind_freelike_block(void *ptr, size_t usize);
106#endif
107
108#endif /* JEMALLOC_H_EXTERNS */
109/******************************************************************************/
110#ifdef JEMALLOC_H_INLINES
111
112#endif /* JEMALLOC_H_INLINES */
113/******************************************************************************/
114
115