1 #ifndef JEMALLOC_INTERNAL_BITMAP_H
2 #define JEMALLOC_INTERNAL_BITMAP_H
4 #include "jemalloc/internal/arena_types.h"
5 #include "jemalloc/internal/bit_util.h"
6 #include "jemalloc/internal/size_classes.h"
8 typedef unsigned long bitmap_t;
9 #define LG_SIZEOF_BITMAP LG_SIZEOF_LONG
11 /* Maximum bitmap bit count is 2^LG_BITMAP_MAXBITS. */
12 #if LG_SLAB_MAXREGS > LG_CEIL_NSIZES
13 /* Maximum bitmap bit count is determined by maximum regions per slab. */
14 # define LG_BITMAP_MAXBITS LG_SLAB_MAXREGS
16 /* Maximum bitmap bit count is determined by number of extent size classes. */
17 # define LG_BITMAP_MAXBITS LG_CEIL_NSIZES
19 #define BITMAP_MAXBITS (ZU(1) << LG_BITMAP_MAXBITS)
21 /* Number of bits per group. */
22 #define LG_BITMAP_GROUP_NBITS (LG_SIZEOF_BITMAP + 3)
23 #define BITMAP_GROUP_NBITS (1U << LG_BITMAP_GROUP_NBITS)
24 #define BITMAP_GROUP_NBITS_MASK (BITMAP_GROUP_NBITS-1)
27 * Do some analysis on how big the bitmap is before we use a tree. For a brute
28 * force linear search, if we would have to call ffs_lu() more than 2^3 times,
31 #if LG_BITMAP_MAXBITS - LG_BITMAP_GROUP_NBITS > 3
32 # define BITMAP_USE_TREE
35 /* Number of groups required to store a given number of bits. */
36 #define BITMAP_BITS2GROUPS(nbits) \
37 (((nbits) + BITMAP_GROUP_NBITS_MASK) >> LG_BITMAP_GROUP_NBITS)
40 * Number of groups required at a particular level for a given number of bits.
42 #define BITMAP_GROUPS_L0(nbits) \
43 BITMAP_BITS2GROUPS(nbits)
44 #define BITMAP_GROUPS_L1(nbits) \
45 BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS(nbits))
46 #define BITMAP_GROUPS_L2(nbits) \
47 BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS((nbits))))
48 #define BITMAP_GROUPS_L3(nbits) \
49 BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS( \
50 BITMAP_BITS2GROUPS((nbits)))))
51 #define BITMAP_GROUPS_L4(nbits) \
52 BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS( \
53 BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS((nbits))))))
56 * Assuming the number of levels, number of groups required for a given number
59 #define BITMAP_GROUPS_1_LEVEL(nbits) \
60 BITMAP_GROUPS_L0(nbits)
61 #define BITMAP_GROUPS_2_LEVEL(nbits) \
62 (BITMAP_GROUPS_1_LEVEL(nbits) + BITMAP_GROUPS_L1(nbits))
63 #define BITMAP_GROUPS_3_LEVEL(nbits) \
64 (BITMAP_GROUPS_2_LEVEL(nbits) + BITMAP_GROUPS_L2(nbits))
65 #define BITMAP_GROUPS_4_LEVEL(nbits) \
66 (BITMAP_GROUPS_3_LEVEL(nbits) + BITMAP_GROUPS_L3(nbits))
67 #define BITMAP_GROUPS_5_LEVEL(nbits) \
68 (BITMAP_GROUPS_4_LEVEL(nbits) + BITMAP_GROUPS_L4(nbits))
71 * Maximum number of groups required to support LG_BITMAP_MAXBITS.
73 #ifdef BITMAP_USE_TREE
75 #if LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS
76 # define BITMAP_GROUPS(nbits) BITMAP_GROUPS_1_LEVEL(nbits)
77 # define BITMAP_GROUPS_MAX BITMAP_GROUPS_1_LEVEL(BITMAP_MAXBITS)
78 #elif LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS * 2
79 # define BITMAP_GROUPS(nbits) BITMAP_GROUPS_2_LEVEL(nbits)
80 # define BITMAP_GROUPS_MAX BITMAP_GROUPS_2_LEVEL(BITMAP_MAXBITS)
81 #elif LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS * 3
82 # define BITMAP_GROUPS(nbits) BITMAP_GROUPS_3_LEVEL(nbits)
83 # define BITMAP_GROUPS_MAX BITMAP_GROUPS_3_LEVEL(BITMAP_MAXBITS)
84 #elif LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS * 4
85 # define BITMAP_GROUPS(nbits) BITMAP_GROUPS_4_LEVEL(nbits)
86 # define BITMAP_GROUPS_MAX BITMAP_GROUPS_4_LEVEL(BITMAP_MAXBITS)
87 #elif LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS * 5
88 # define BITMAP_GROUPS(nbits) BITMAP_GROUPS_5_LEVEL(nbits)
89 # define BITMAP_GROUPS_MAX BITMAP_GROUPS_5_LEVEL(BITMAP_MAXBITS)
91 # error "Unsupported bitmap size"
95 * Maximum number of levels possible. This could be statically computed based
96 * on LG_BITMAP_MAXBITS:
98 * #define BITMAP_MAX_LEVELS \
99 * (LG_BITMAP_MAXBITS / LG_SIZEOF_BITMAP) \
100 * + !!(LG_BITMAP_MAXBITS % LG_SIZEOF_BITMAP)
102 * However, that would not allow the generic BITMAP_INFO_INITIALIZER() macro, so
103 * instead hardcode BITMAP_MAX_LEVELS to the largest number supported by the
104 * various cascading macros. The only additional cost this incurs is some
105 * unused trailing entries in bitmap_info_t structures; the bitmaps themselves
108 #define BITMAP_MAX_LEVELS 5
110 #define BITMAP_INFO_INITIALIZER(nbits) { \
114 (BITMAP_GROUPS_L0(nbits) > BITMAP_GROUPS_L1(nbits)) + \
115 (BITMAP_GROUPS_L1(nbits) > BITMAP_GROUPS_L2(nbits)) + \
116 (BITMAP_GROUPS_L2(nbits) > BITMAP_GROUPS_L3(nbits)) + \
117 (BITMAP_GROUPS_L3(nbits) > BITMAP_GROUPS_L4(nbits)) + 1, \
121 {BITMAP_GROUPS_L0(nbits)}, \
122 {BITMAP_GROUPS_L1(nbits) + BITMAP_GROUPS_L0(nbits)}, \
123 {BITMAP_GROUPS_L2(nbits) + BITMAP_GROUPS_L1(nbits) + \
124 BITMAP_GROUPS_L0(nbits)}, \
125 {BITMAP_GROUPS_L3(nbits) + BITMAP_GROUPS_L2(nbits) + \
126 BITMAP_GROUPS_L1(nbits) + BITMAP_GROUPS_L0(nbits)}, \
127 {BITMAP_GROUPS_L4(nbits) + BITMAP_GROUPS_L3(nbits) + \
128 BITMAP_GROUPS_L2(nbits) + BITMAP_GROUPS_L1(nbits) \
129 + BITMAP_GROUPS_L0(nbits)} \
133 #else /* BITMAP_USE_TREE */
135 #define BITMAP_GROUPS(nbits) BITMAP_BITS2GROUPS(nbits)
136 #define BITMAP_GROUPS_MAX BITMAP_BITS2GROUPS(BITMAP_MAXBITS)
138 #define BITMAP_INFO_INITIALIZER(nbits) { \
142 BITMAP_BITS2GROUPS(nbits) \
145 #endif /* BITMAP_USE_TREE */
147 typedef struct bitmap_level_s {
148 /* Offset of this level's groups within the array of groups. */
152 typedef struct bitmap_info_s {
153 /* Logical number of bits in bitmap (stored at bottom level). */
156 #ifdef BITMAP_USE_TREE
157 /* Number of levels necessary for nbits. */
161 * Only the first (nlevels+1) elements are used, and levels are ordered
162 * bottom to top (e.g. the bottom level is stored in levels[0]).
164 bitmap_level_t levels[BITMAP_MAX_LEVELS+1];
165 #else /* BITMAP_USE_TREE */
166 /* Number of groups necessary for nbits. */
168 #endif /* BITMAP_USE_TREE */
171 void bitmap_info_init(bitmap_info_t *binfo, size_t nbits);
172 void bitmap_init(bitmap_t *bitmap, const bitmap_info_t *binfo, bool fill);
173 size_t bitmap_size(const bitmap_info_t *binfo);
176 bitmap_full(bitmap_t *bitmap, const bitmap_info_t *binfo) {
177 #ifdef BITMAP_USE_TREE
178 size_t rgoff = binfo->levels[binfo->nlevels].group_offset - 1;
179 bitmap_t rg = bitmap[rgoff];
180 /* The bitmap is full iff the root group is 0. */
185 for (i = 0; i < binfo->ngroups; i++) {
186 if (bitmap[i] != 0) {
195 bitmap_get(bitmap_t *bitmap, const bitmap_info_t *binfo, size_t bit) {
199 assert(bit < binfo->nbits);
200 goff = bit >> LG_BITMAP_GROUP_NBITS;
202 return !(g & (ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK)));
206 bitmap_set(bitmap_t *bitmap, const bitmap_info_t *binfo, size_t bit) {
211 assert(bit < binfo->nbits);
212 assert(!bitmap_get(bitmap, binfo, bit));
213 goff = bit >> LG_BITMAP_GROUP_NBITS;
216 assert(g & (ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK)));
217 g ^= ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK);
219 assert(bitmap_get(bitmap, binfo, bit));
220 #ifdef BITMAP_USE_TREE
221 /* Propagate group state transitions up the tree. */
224 for (i = 1; i < binfo->nlevels; i++) {
226 goff = bit >> LG_BITMAP_GROUP_NBITS;
227 gp = &bitmap[binfo->levels[i].group_offset + goff];
229 assert(g & (ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK)));
230 g ^= ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK);
240 /* ffu: find first unset >= bit. */
242 bitmap_ffu(const bitmap_t *bitmap, const bitmap_info_t *binfo, size_t min_bit) {
243 assert(min_bit < binfo->nbits);
245 #ifdef BITMAP_USE_TREE
247 for (unsigned level = binfo->nlevels; level--;) {
248 size_t lg_bits_per_group = (LG_BITMAP_GROUP_NBITS * (level +
250 bitmap_t group = bitmap[binfo->levels[level].group_offset + (bit
251 >> lg_bits_per_group)];
252 unsigned group_nmask = (unsigned)(((min_bit > bit) ? (min_bit -
253 bit) : 0) >> (lg_bits_per_group - LG_BITMAP_GROUP_NBITS));
254 assert(group_nmask <= BITMAP_GROUP_NBITS);
255 bitmap_t group_mask = ~((1LU << group_nmask) - 1);
256 bitmap_t group_masked = group & group_mask;
257 if (group_masked == 0LU) {
262 * min_bit was preceded by one or more unset bits in
263 * this group, but there are no other unset bits in this
264 * group. Try again starting at the first bit of the
265 * next sibling. This will recurse at most once per
268 size_t sib_base = bit + (ZU(1) << lg_bits_per_group);
269 assert(sib_base > min_bit);
270 assert(sib_base > bit);
271 if (sib_base >= binfo->nbits) {
274 return bitmap_ffu(bitmap, binfo, sib_base);
276 bit += ((size_t)(ffs_lu(group_masked) - 1)) <<
277 (lg_bits_per_group - LG_BITMAP_GROUP_NBITS);
279 assert(bit >= min_bit);
280 assert(bit < binfo->nbits);
283 size_t i = min_bit >> LG_BITMAP_GROUP_NBITS;
284 bitmap_t g = bitmap[i] & ~((1LU << (min_bit & BITMAP_GROUP_NBITS_MASK))
290 return (i << LG_BITMAP_GROUP_NBITS) + (bit - 1);
294 } while (i < binfo->ngroups);
299 /* sfu: set first unset. */
301 bitmap_sfu(bitmap_t *bitmap, const bitmap_info_t *binfo) {
306 assert(!bitmap_full(bitmap, binfo));
308 #ifdef BITMAP_USE_TREE
309 i = binfo->nlevels - 1;
310 g = bitmap[binfo->levels[i].group_offset];
314 g = bitmap[binfo->levels[i].group_offset + bit];
315 bit = (bit << LG_BITMAP_GROUP_NBITS) + (ffs_lu(g) - 1);
320 while ((bit = ffs_lu(g)) == 0) {
324 bit = (i << LG_BITMAP_GROUP_NBITS) + (bit - 1);
326 bitmap_set(bitmap, binfo, bit);
331 bitmap_unset(bitmap_t *bitmap, const bitmap_info_t *binfo, size_t bit) {
335 UNUSED bool propagate;
337 assert(bit < binfo->nbits);
338 assert(bitmap_get(bitmap, binfo, bit));
339 goff = bit >> LG_BITMAP_GROUP_NBITS;
342 propagate = (g == 0);
343 assert((g & (ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK))) == 0);
344 g ^= ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK);
346 assert(!bitmap_get(bitmap, binfo, bit));
347 #ifdef BITMAP_USE_TREE
348 /* Propagate group state transitions up the tree. */
351 for (i = 1; i < binfo->nlevels; i++) {
353 goff = bit >> LG_BITMAP_GROUP_NBITS;
354 gp = &bitmap[binfo->levels[i].group_offset + goff];
356 propagate = (g == 0);
357 assert((g & (ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK)))
359 g ^= ZU(1) << (bit & BITMAP_GROUP_NBITS_MASK);
366 #endif /* BITMAP_USE_TREE */
369 #endif /* JEMALLOC_INTERNAL_BITMAP_H */