1 | #ifndef JEMALLOC_INTERNAL_ECACHE_H |
2 | #define JEMALLOC_INTERNAL_ECACHE_H |
3 | |
4 | #include "jemalloc/internal/eset.h" |
5 | #include "jemalloc/internal/san.h" |
6 | #include "jemalloc/internal/mutex.h" |
7 | |
8 | typedef struct ecache_s ecache_t; |
9 | struct ecache_s { |
10 | malloc_mutex_t mtx; |
11 | eset_t eset; |
12 | eset_t guarded_eset; |
13 | /* All stored extents must be in the same state. */ |
14 | extent_state_t state; |
15 | /* The index of the ehooks the ecache is associated with. */ |
16 | unsigned ind; |
17 | /* |
18 | * If true, delay coalescing until eviction; otherwise coalesce during |
19 | * deallocation. |
20 | */ |
21 | bool delay_coalesce; |
22 | }; |
23 | |
24 | static inline size_t |
25 | ecache_npages_get(ecache_t *ecache) { |
26 | return eset_npages_get(&ecache->eset) + |
27 | eset_npages_get(&ecache->guarded_eset); |
28 | } |
29 | |
30 | /* Get the number of extents in the given page size index. */ |
31 | static inline size_t |
32 | ecache_nextents_get(ecache_t *ecache, pszind_t ind) { |
33 | return eset_nextents_get(&ecache->eset, ind) + |
34 | eset_nextents_get(&ecache->guarded_eset, ind); |
35 | } |
36 | |
37 | /* Get the sum total bytes of the extents in the given page size index. */ |
38 | static inline size_t |
39 | ecache_nbytes_get(ecache_t *ecache, pszind_t ind) { |
40 | return eset_nbytes_get(&ecache->eset, ind) + |
41 | eset_nbytes_get(&ecache->guarded_eset, ind); |
42 | } |
43 | |
44 | static inline unsigned |
45 | ecache_ind_get(ecache_t *ecache) { |
46 | return ecache->ind; |
47 | } |
48 | |
49 | bool ecache_init(tsdn_t *tsdn, ecache_t *ecache, extent_state_t state, |
50 | unsigned ind, bool delay_coalesce); |
51 | void ecache_prefork(tsdn_t *tsdn, ecache_t *ecache); |
52 | void ecache_postfork_parent(tsdn_t *tsdn, ecache_t *ecache); |
53 | void ecache_postfork_child(tsdn_t *tsdn, ecache_t *ecache); |
54 | |
55 | #endif /* JEMALLOC_INTERNAL_ECACHE_H */ |
56 | |