| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 1 | /******************************************************************************/ |
| 2 | #ifdef JEMALLOC_H_TYPES |
| 3 | |
| 4 | typedef struct extent_node_s extent_node_t; |
| 5 | |
| 6 | #endif /* JEMALLOC_H_TYPES */ |
| 7 | /******************************************************************************/ |
| 8 | #ifdef JEMALLOC_H_STRUCTS |
| 9 | |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 10 | /* Tree of extents. Use accessor functions for en_* fields. */ |
| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 11 | struct extent_node_s { |
| Jason Evans | cbf3a6d | 2015-02-11 12:24:27 -0800 | [diff] [blame] | 12 | /* Arena from which this extent came, if any. */ |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 13 | arena_t *en_arena; |
| Jason Evans | 6109fe0 | 2010-02-10 10:37:56 -0800 | [diff] [blame] | 14 | |
| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 15 | /* Pointer to the extent that this tree node is responsible for. */ |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 16 | void *en_addr; |
| 17 | |
| 18 | /* Total region size. */ |
| 19 | size_t en_size; |
| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 20 | |
| Jason Evans | cbf3a6d | 2015-02-11 12:24:27 -0800 | [diff] [blame] | 21 | /* |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 22 | * True if physical memory is committed to the extent, whether |
| 23 | * explicitly or implicitly as on a system that overcommits and |
| 24 | * satisfies physical mamory needs on demand via soft page faults. |
| 25 | */ |
| 26 | bool en_committed; |
| 27 | |
| 28 | /* |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 29 | * The zeroed flag is used by chunk recycling code to track whether |
| 30 | * memory is zero-filled. |
| Jason Evans | cbf3a6d | 2015-02-11 12:24:27 -0800 | [diff] [blame] | 31 | */ |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 32 | bool en_zeroed; |
| Jason Evans | 7de9276 | 2012-10-08 17:56:11 -0700 | [diff] [blame] | 33 | |
| Jason Evans | 918a1a5 | 2015-01-30 21:21:16 -0800 | [diff] [blame] | 34 | /* |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 35 | * The achunk flag is used to validate that huge allocation lookups |
| 36 | * don't return arena chunks. |
| Jason Evans | 918a1a5 | 2015-01-30 21:21:16 -0800 | [diff] [blame] | 37 | */ |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 38 | bool en_achunk; |
| 39 | |
| Jason Evans | a4e1888 | 2015-02-17 15:13:52 -0800 | [diff] [blame] | 40 | /* Profile counters, used for huge objects. */ |
| 41 | prof_tctx_t *en_prof_tctx; |
| Jason Evans | 918a1a5 | 2015-01-30 21:21:16 -0800 | [diff] [blame] | 42 | |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 43 | /* Linkage for arena's runs_dirty and chunks_cache rings. */ |
| Jason Evans | f5c8f37 | 2015-03-10 18:29:49 -0700 | [diff] [blame] | 44 | arena_runs_dirty_link_t rd; |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 45 | qr(extent_node_t) cc_link; |
| Jason Evans | cbf3a6d | 2015-02-11 12:24:27 -0800 | [diff] [blame] | 46 | |
| 47 | union { |
| 48 | /* Linkage for the size/address-ordered tree. */ |
| Jason Evans | 2195ba4 | 2015-02-15 16:43:52 -0800 | [diff] [blame] | 49 | rb_node(extent_node_t) szad_link; |
| Jason Evans | cbf3a6d | 2015-02-11 12:24:27 -0800 | [diff] [blame] | 50 | |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 51 | /* Linkage for arena's huge and node_cache lists. */ |
| Jason Evans | 2195ba4 | 2015-02-15 16:43:52 -0800 | [diff] [blame] | 52 | ql_elm(extent_node_t) ql_link; |
| Jason Evans | cbf3a6d | 2015-02-11 12:24:27 -0800 | [diff] [blame] | 53 | }; |
| 54 | |
| 55 | /* Linkage for the address-ordered tree. */ |
| Jason Evans | 2195ba4 | 2015-02-15 16:43:52 -0800 | [diff] [blame] | 56 | rb_node(extent_node_t) ad_link; |
| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 57 | }; |
| 58 | typedef rb_tree(extent_node_t) extent_tree_t; |
| 59 | |
| 60 | #endif /* JEMALLOC_H_STRUCTS */ |
| 61 | /******************************************************************************/ |
| 62 | #ifdef JEMALLOC_H_EXTERNS |
| 63 | |
| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 64 | rb_proto(, extent_tree_szad_, extent_tree_t, extent_node_t) |
| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 65 | |
| 66 | rb_proto(, extent_tree_ad_, extent_tree_t, extent_node_t) |
| 67 | |
| 68 | #endif /* JEMALLOC_H_EXTERNS */ |
| 69 | /******************************************************************************/ |
| 70 | #ifdef JEMALLOC_H_INLINES |
| 71 | |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 72 | #ifndef JEMALLOC_ENABLE_INLINE |
| 73 | arena_t *extent_node_arena_get(const extent_node_t *node); |
| 74 | void *extent_node_addr_get(const extent_node_t *node); |
| 75 | size_t extent_node_size_get(const extent_node_t *node); |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 76 | bool extent_node_committed_get(const extent_node_t *node); |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 77 | bool extent_node_zeroed_get(const extent_node_t *node); |
| 78 | bool extent_node_achunk_get(const extent_node_t *node); |
| 79 | prof_tctx_t *extent_node_prof_tctx_get(const extent_node_t *node); |
| 80 | void extent_node_arena_set(extent_node_t *node, arena_t *arena); |
| 81 | void extent_node_addr_set(extent_node_t *node, void *addr); |
| 82 | void extent_node_size_set(extent_node_t *node, size_t size); |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 83 | void extent_node_committed_set(extent_node_t *node, bool committed); |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 84 | void extent_node_zeroed_set(extent_node_t *node, bool zeroed); |
| 85 | void extent_node_achunk_set(extent_node_t *node, bool achunk); |
| 86 | void extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx); |
| Jason Evans | a4e1888 | 2015-02-17 15:13:52 -0800 | [diff] [blame] | 87 | void extent_node_init(extent_node_t *node, arena_t *arena, void *addr, |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 88 | size_t size, bool committed, bool zeroed); |
| Jason Evans | 47701b2 | 2015-02-17 22:23:10 -0800 | [diff] [blame] | 89 | void extent_node_dirty_linkage_init(extent_node_t *node); |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 90 | void extent_node_dirty_insert(extent_node_t *node, |
| Jason Evans | 38e42d3 | 2015-03-10 18:15:40 -0700 | [diff] [blame] | 91 | arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty); |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 92 | void extent_node_dirty_remove(extent_node_t *node); |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 93 | #endif |
| 94 | |
| 95 | #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_)) |
| 96 | JEMALLOC_INLINE arena_t * |
| 97 | extent_node_arena_get(const extent_node_t *node) |
| 98 | { |
| 99 | |
| 100 | return (node->en_arena); |
| 101 | } |
| 102 | |
| 103 | JEMALLOC_INLINE void * |
| 104 | extent_node_addr_get(const extent_node_t *node) |
| 105 | { |
| 106 | |
| 107 | return (node->en_addr); |
| 108 | } |
| 109 | |
| 110 | JEMALLOC_INLINE size_t |
| 111 | extent_node_size_get(const extent_node_t *node) |
| 112 | { |
| 113 | |
| 114 | return (node->en_size); |
| 115 | } |
| 116 | |
| 117 | JEMALLOC_INLINE bool |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 118 | extent_node_committed_get(const extent_node_t *node) |
| 119 | { |
| 120 | |
| 121 | return (node->en_committed); |
| 122 | } |
| 123 | |
| 124 | JEMALLOC_INLINE bool |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 125 | extent_node_zeroed_get(const extent_node_t *node) |
| 126 | { |
| 127 | |
| 128 | return (node->en_zeroed); |
| 129 | } |
| 130 | |
| 131 | JEMALLOC_INLINE bool |
| 132 | extent_node_achunk_get(const extent_node_t *node) |
| 133 | { |
| 134 | |
| 135 | return (node->en_achunk); |
| 136 | } |
| 137 | |
| 138 | JEMALLOC_INLINE prof_tctx_t * |
| 139 | extent_node_prof_tctx_get(const extent_node_t *node) |
| 140 | { |
| 141 | |
| 142 | return (node->en_prof_tctx); |
| 143 | } |
| 144 | |
| 145 | JEMALLOC_INLINE void |
| 146 | extent_node_arena_set(extent_node_t *node, arena_t *arena) |
| 147 | { |
| 148 | |
| 149 | node->en_arena = arena; |
| 150 | } |
| 151 | |
| 152 | JEMALLOC_INLINE void |
| 153 | extent_node_addr_set(extent_node_t *node, void *addr) |
| 154 | { |
| 155 | |
| 156 | node->en_addr = addr; |
| 157 | } |
| 158 | |
| 159 | JEMALLOC_INLINE void |
| 160 | extent_node_size_set(extent_node_t *node, size_t size) |
| 161 | { |
| 162 | |
| 163 | node->en_size = size; |
| 164 | } |
| 165 | |
| 166 | JEMALLOC_INLINE void |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 167 | extent_node_committed_set(extent_node_t *node, bool committed) |
| 168 | { |
| 169 | |
| 170 | node->en_committed = committed; |
| 171 | } |
| 172 | |
| 173 | JEMALLOC_INLINE void |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 174 | extent_node_zeroed_set(extent_node_t *node, bool zeroed) |
| 175 | { |
| 176 | |
| 177 | node->en_zeroed = zeroed; |
| 178 | } |
| 179 | |
| 180 | JEMALLOC_INLINE void |
| 181 | extent_node_achunk_set(extent_node_t *node, bool achunk) |
| 182 | { |
| 183 | |
| 184 | node->en_achunk = achunk; |
| 185 | } |
| 186 | |
| 187 | JEMALLOC_INLINE void |
| 188 | extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx) |
| 189 | { |
| 190 | |
| 191 | node->en_prof_tctx = tctx; |
| 192 | } |
| Jason Evans | a4e1888 | 2015-02-17 15:13:52 -0800 | [diff] [blame] | 193 | |
| 194 | JEMALLOC_INLINE void |
| 195 | extent_node_init(extent_node_t *node, arena_t *arena, void *addr, size_t size, |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 196 | bool committed, bool zeroed) |
| Jason Evans | a4e1888 | 2015-02-17 15:13:52 -0800 | [diff] [blame] | 197 | { |
| 198 | |
| 199 | extent_node_arena_set(node, arena); |
| 200 | extent_node_addr_set(node, addr); |
| 201 | extent_node_size_set(node, size); |
| Jason Evans | b49a334 | 2015-07-28 11:28:19 -0400 | [diff] [blame^] | 202 | extent_node_committed_set(node, committed); |
| Jason Evans | a4e1888 | 2015-02-17 15:13:52 -0800 | [diff] [blame] | 203 | extent_node_zeroed_set(node, zeroed); |
| 204 | extent_node_achunk_set(node, false); |
| 205 | if (config_prof) |
| 206 | extent_node_prof_tctx_set(node, NULL); |
| 207 | } |
| Jason Evans | 47701b2 | 2015-02-17 22:23:10 -0800 | [diff] [blame] | 208 | |
| 209 | JEMALLOC_INLINE void |
| 210 | extent_node_dirty_linkage_init(extent_node_t *node) |
| 211 | { |
| 212 | |
| Jason Evans | f5c8f37 | 2015-03-10 18:29:49 -0700 | [diff] [blame] | 213 | qr_new(&node->rd, rd_link); |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 214 | qr_new(node, cc_link); |
| Jason Evans | 47701b2 | 2015-02-17 22:23:10 -0800 | [diff] [blame] | 215 | } |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 216 | |
| 217 | JEMALLOC_INLINE void |
| 218 | extent_node_dirty_insert(extent_node_t *node, |
| Jason Evans | 38e42d3 | 2015-03-10 18:15:40 -0700 | [diff] [blame] | 219 | arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty) |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 220 | { |
| 221 | |
| Jason Evans | f5c8f37 | 2015-03-10 18:29:49 -0700 | [diff] [blame] | 222 | qr_meld(runs_dirty, &node->rd, rd_link); |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 223 | qr_meld(chunks_dirty, node, cc_link); |
| 224 | } |
| 225 | |
| 226 | JEMALLOC_INLINE void |
| 227 | extent_node_dirty_remove(extent_node_t *node) |
| 228 | { |
| 229 | |
| Jason Evans | f5c8f37 | 2015-03-10 18:29:49 -0700 | [diff] [blame] | 230 | qr_remove(&node->rd, rd_link); |
| Jason Evans | 738e089 | 2015-02-18 01:15:50 -0800 | [diff] [blame] | 231 | qr_remove(node, cc_link); |
| 232 | } |
| 233 | |
| Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 234 | #endif |
| 235 | |
| Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 236 | #endif /* JEMALLOC_H_INLINES */ |
| 237 | /******************************************************************************/ |
| 238 | |