1 | #ifndef JEMALLOC_INTERNAL_EXP_GROW_H |
---|---|
2 | #define JEMALLOC_INTERNAL_EXP_GROW_H |
3 | |
4 | typedef struct exp_grow_s exp_grow_t; |
5 | struct exp_grow_s { |
6 | /* |
7 | * Next extent size class in a growing series to use when satisfying a |
8 | * request via the extent hooks (only if opt_retain). This limits the |
9 | * number of disjoint virtual memory ranges so that extent merging can |
10 | * be effective even if multiple arenas' extent allocation requests are |
11 | * highly interleaved. |
12 | * |
13 | * retain_grow_limit is the max allowed size ind to expand (unless the |
14 | * required size is greater). Default is no limit, and controlled |
15 | * through mallctl only. |
16 | */ |
17 | pszind_t next; |
18 | pszind_t limit; |
19 | }; |
20 | |
21 | static inline bool |
22 | exp_grow_size_prepare(exp_grow_t *exp_grow, size_t alloc_size_min, |
23 | size_t *r_alloc_size, pszind_t *r_skip) { |
24 | *r_skip = 0; |
25 | *r_alloc_size = sz_pind2sz(exp_grow->next + *r_skip); |
26 | while (*r_alloc_size < alloc_size_min) { |
27 | (*r_skip)++; |
28 | if (exp_grow->next + *r_skip >= |
29 | sz_psz2ind(SC_LARGE_MAXCLASS)) { |
30 | /* Outside legal range. */ |
31 | return true; |
32 | } |
33 | *r_alloc_size = sz_pind2sz(exp_grow->next + *r_skip); |
34 | } |
35 | return false; |
36 | } |
37 | |
38 | static inline void |
39 | exp_grow_size_commit(exp_grow_t *exp_grow, pszind_t skip) { |
40 | if (exp_grow->next + skip + 1 <= exp_grow->limit) { |
41 | exp_grow->next += skip + 1; |
42 | } else { |
43 | exp_grow->next = exp_grow->limit; |
44 | } |
45 | |
46 | } |
47 | |
48 | void exp_grow_init(exp_grow_t *exp_grow); |
49 | |
50 | #endif /* JEMALLOC_INTERNAL_EXP_GROW_H */ |
51 |