1 | #ifndef JEMALLOC_INTERNAL_SAN_BUMP_H |
---|---|
2 | #define JEMALLOC_INTERNAL_SAN_BUMP_H |
3 | |
4 | #include "jemalloc/internal/edata.h" |
5 | #include "jemalloc/internal/exp_grow.h" |
6 | #include "jemalloc/internal/mutex.h" |
7 | |
8 | #define SBA_RETAINED_ALLOC_SIZE ((size_t)4 << 20) |
9 | |
10 | extern bool opt_retain; |
11 | |
12 | typedef struct ehooks_s ehooks_t; |
13 | typedef struct pac_s pac_t; |
14 | |
15 | typedef struct san_bump_alloc_s san_bump_alloc_t; |
16 | struct san_bump_alloc_s { |
17 | malloc_mutex_t mtx; |
18 | |
19 | edata_t *curr_reg; |
20 | }; |
21 | |
22 | static inline bool |
23 | san_bump_enabled() { |
24 | /* |
25 | * We enable san_bump allocator only when it's possible to break up a |
26 | * mapping and unmap a part of it (maps_coalesce). This is needed to |
27 | * ensure the arena destruction process can destroy all retained guarded |
28 | * extents one by one and to unmap a trailing part of a retained guarded |
29 | * region when it's too small to fit a pending allocation. |
30 | * opt_retain is required, because this allocator retains a large |
31 | * virtual memory mapping and returns smaller parts of it. |
32 | */ |
33 | return maps_coalesce && opt_retain; |
34 | } |
35 | |
36 | static inline bool |
37 | san_bump_alloc_init(san_bump_alloc_t* sba) { |
38 | bool err = malloc_mutex_init(&sba->mtx, "sanitizer_bump_allocator", |
39 | WITNESS_RANK_SAN_BUMP_ALLOC, malloc_mutex_rank_exclusive); |
40 | if (err) { |
41 | return true; |
42 | } |
43 | sba->curr_reg = NULL; |
44 | |
45 | return false; |
46 | } |
47 | |
48 | edata_t * |
49 | san_bump_alloc(tsdn_t *tsdn, san_bump_alloc_t* sba, pac_t *pac, ehooks_t *ehooks, |
50 | size_t size, bool zero); |
51 | |
52 | #endif /* JEMALLOC_INTERNAL_SAN_BUMP_H */ |
53 |