1 | #ifndef JEMALLOC_INTERNAL_TCACHE_STRUCTS_H |
2 | #define JEMALLOC_INTERNAL_TCACHE_STRUCTS_H |
3 | |
4 | #include "jemalloc/internal/cache_bin.h" |
5 | #include "jemalloc/internal/ql.h" |
6 | #include "jemalloc/internal/sc.h" |
7 | #include "jemalloc/internal/ticker.h" |
8 | #include "jemalloc/internal/tsd_types.h" |
9 | |
10 | /* |
11 | * The tcache state is split into the slow and hot path data. Each has a |
12 | * pointer to the other, and the data always comes in pairs. The layout of each |
13 | * of them varies in practice; tcache_slow lives in the TSD for the automatic |
14 | * tcache, and as part of a dynamic allocation for manual allocations. Keeping |
15 | * a pointer to tcache_slow lets us treat these cases uniformly, rather than |
16 | * splitting up the tcache [de]allocation code into those paths called with the |
17 | * TSD tcache and those called with a manual tcache. |
18 | */ |
19 | |
20 | struct tcache_slow_s { |
21 | /* Lets us track all the tcaches in an arena. */ |
22 | ql_elm(tcache_slow_t) link; |
23 | |
24 | /* |
25 | * The descriptor lets the arena find our cache bins without seeing the |
26 | * tcache definition. This enables arenas to aggregate stats across |
27 | * tcaches without having a tcache dependency. |
28 | */ |
29 | cache_bin_array_descriptor_t cache_bin_array_descriptor; |
30 | |
31 | /* The arena this tcache is associated with. */ |
32 | arena_t *arena; |
33 | /* Next bin to GC. */ |
34 | szind_t next_gc_bin; |
35 | /* For small bins, fill (ncached_max >> lg_fill_div). */ |
36 | uint8_t lg_fill_div[SC_NBINS]; |
37 | /* For small bins, whether has been refilled since last GC. */ |
38 | bool bin_refilled[SC_NBINS]; |
39 | /* |
40 | * For small bins, the number of items we can pretend to flush before |
41 | * actually flushing. |
42 | */ |
43 | uint8_t bin_flush_delay_items[SC_NBINS]; |
44 | /* |
45 | * The start of the allocation containing the dynamic allocation for |
46 | * either the cache bins alone, or the cache bin memory as well as this |
47 | * tcache_slow_t and its associated tcache_t. |
48 | */ |
49 | void *dyn_alloc; |
50 | |
51 | /* The associated bins. */ |
52 | tcache_t *tcache; |
53 | }; |
54 | |
55 | struct tcache_s { |
56 | tcache_slow_t *tcache_slow; |
57 | cache_bin_t bins[TCACHE_NBINS_MAX]; |
58 | }; |
59 | |
60 | /* Linkage for list of available (previously used) explicit tcache IDs. */ |
61 | struct tcaches_s { |
62 | union { |
63 | tcache_t *tcache; |
64 | tcaches_t *next; |
65 | }; |
66 | }; |
67 | |
68 | #endif /* JEMALLOC_INTERNAL_TCACHE_STRUCTS_H */ |
69 | |