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 10 /* Tree of extents. Use accessor functions for en_* fields. */ 11 struct extent_node_s { 12 /* Arena from which this extent came, if any. */ 13 arena_t *en_arena; 14 15 /* Pointer to the extent that this tree node is responsible for. */ 16 void *en_addr; 17 18 /* Total region size. */ 19 size_t en_size; 20 21 /* 22 * The zeroed flag is used by chunk recycling code to track whether 23 * memory is zero-filled. 24 */ 25 bool en_zeroed; 26 27 /* 28 * The achunk flag is used to validate that huge allocation lookups 29 * don't return arena chunks. 30 */ 31 bool en_achunk; 32 33 /* Profile counters, used for huge objects. */ 34 prof_tctx_t *en_prof_tctx; 35 36 /* Linkage for arena's runs_dirty and chunks_cache rings. */ 37 arena_runs_dirty_link_t rd; 38 qr(extent_node_t) cc_link; 39 40 union { 41 /* Linkage for the size/address-ordered tree. */ 42 rb_node(extent_node_t) szad_link; 43 44 /* Linkage for arena's huge and node_cache lists. */ 45 ql_elm(extent_node_t) ql_link; 46 }; 47 48 /* Linkage for the address-ordered tree. */ 49 rb_node(extent_node_t) ad_link; 50 }; 51 typedef rb_tree(extent_node_t) extent_tree_t; 52 53 #endif /* JEMALLOC_H_STRUCTS */ 54 /******************************************************************************/ 55 #ifdef JEMALLOC_H_EXTERNS 56 57 rb_proto(, extent_tree_szad_, extent_tree_t, extent_node_t) 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 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); 78 void extent_node_init(extent_node_t *node, arena_t *arena, void *addr, 79 size_t size, bool zeroed); 80 void extent_node_dirty_linkage_init(extent_node_t *node); 81 void extent_node_dirty_insert(extent_node_t *node, 82 arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty); 83 void extent_node_dirty_remove(extent_node_t *node); 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 } 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 } 184 185 JEMALLOC_INLINE void 186 extent_node_dirty_linkage_init(extent_node_t *node) 187 { 188 189 qr_new(&node->rd, rd_link); 190 qr_new(node, cc_link); 191 } 192 193 JEMALLOC_INLINE void 194 extent_node_dirty_insert(extent_node_t *node, 195 arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty) 196 { 197 198 qr_meld(runs_dirty, &node->rd, rd_link); 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 206 qr_remove(&node->rd, rd_link); 207 qr_remove(node, cc_link); 208 } 209 210 #endif 211 212 #endif /* JEMALLOC_H_INLINES */ 213 /******************************************************************************/ 214 215