1 | #ifndef JEMALLOC_INTERNAL_ARENA_STRUCTS_H |
2 | #define JEMALLOC_INTERNAL_ARENA_STRUCTS_H |
3 | |
4 | #include "jemalloc/internal/arena_stats.h" |
5 | #include "jemalloc/internal/atomic.h" |
6 | #include "jemalloc/internal/bin.h" |
7 | #include "jemalloc/internal/bitmap.h" |
8 | #include "jemalloc/internal/counter.h" |
9 | #include "jemalloc/internal/ecache.h" |
10 | #include "jemalloc/internal/edata_cache.h" |
11 | #include "jemalloc/internal/extent_dss.h" |
12 | #include "jemalloc/internal/jemalloc_internal_types.h" |
13 | #include "jemalloc/internal/mutex.h" |
14 | #include "jemalloc/internal/nstime.h" |
15 | #include "jemalloc/internal/pa.h" |
16 | #include "jemalloc/internal/ql.h" |
17 | #include "jemalloc/internal/sc.h" |
18 | #include "jemalloc/internal/ticker.h" |
19 | |
20 | struct arena_s { |
21 | /* |
22 | * Number of threads currently assigned to this arena. Each thread has |
23 | * two distinct assignments, one for application-serving allocation, and |
24 | * the other for internal metadata allocation. Internal metadata must |
25 | * not be allocated from arenas explicitly created via the arenas.create |
26 | * mallctl, because the arena.<i>.reset mallctl indiscriminately |
27 | * discards all allocations for the affected arena. |
28 | * |
29 | * 0: Application allocation. |
30 | * 1: Internal metadata allocation. |
31 | * |
32 | * Synchronization: atomic. |
33 | */ |
34 | atomic_u_t nthreads[2]; |
35 | |
36 | /* Next bin shard for binding new threads. Synchronization: atomic. */ |
37 | atomic_u_t binshard_next; |
38 | |
39 | /* |
40 | * When percpu_arena is enabled, to amortize the cost of reading / |
41 | * updating the current CPU id, track the most recent thread accessing |
42 | * this arena, and only read CPU if there is a mismatch. |
43 | */ |
44 | tsdn_t *last_thd; |
45 | |
46 | /* Synchronization: internal. */ |
47 | arena_stats_t stats; |
48 | |
49 | /* |
50 | * Lists of tcaches and cache_bin_array_descriptors for extant threads |
51 | * associated with this arena. Stats from these are merged |
52 | * incrementally, and at exit if opt_stats_print is enabled. |
53 | * |
54 | * Synchronization: tcache_ql_mtx. |
55 | */ |
56 | ql_head(tcache_slow_t) tcache_ql; |
57 | ql_head(cache_bin_array_descriptor_t) cache_bin_array_descriptor_ql; |
58 | malloc_mutex_t tcache_ql_mtx; |
59 | |
60 | /* |
61 | * Represents a dss_prec_t, but atomically. |
62 | * |
63 | * Synchronization: atomic. |
64 | */ |
65 | atomic_u_t dss_prec; |
66 | |
67 | /* |
68 | * Extant large allocations. |
69 | * |
70 | * Synchronization: large_mtx. |
71 | */ |
72 | edata_list_active_t large; |
73 | /* Synchronizes all large allocation/update/deallocation. */ |
74 | malloc_mutex_t large_mtx; |
75 | |
76 | /* The page-level allocator shard this arena uses. */ |
77 | pa_shard_t pa_shard; |
78 | |
79 | /* |
80 | * A cached copy of base->ind. This can get accessed on hot paths; |
81 | * looking it up in base requires an extra pointer hop / cache miss. |
82 | */ |
83 | unsigned ind; |
84 | |
85 | /* |
86 | * Base allocator, from which arena metadata are allocated. |
87 | * |
88 | * Synchronization: internal. |
89 | */ |
90 | base_t *base; |
91 | /* Used to determine uptime. Read-only after initialization. */ |
92 | nstime_t create_time; |
93 | |
94 | /* |
95 | * The arena is allocated alongside its bins; really this is a |
96 | * dynamically sized array determined by the binshard settings. |
97 | */ |
98 | bin_t bins[0]; |
99 | }; |
100 | |
101 | #endif /* JEMALLOC_INTERNAL_ARENA_STRUCTS_H */ |
102 | |