Home | History | Annotate | Download | only in internal
      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