1#ifndef JEMALLOC_INTERNAL_EXP_GROW_H
2#define JEMALLOC_INTERNAL_EXP_GROW_H
3
4typedef struct exp_grow_s exp_grow_t;
5struct 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
21static inline bool
22exp_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
38static inline void
39exp_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
48void exp_grow_init(exp_grow_t *exp_grow);
49
50#endif /* JEMALLOC_INTERNAL_EXP_GROW_H */
51