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