sfu: set first unset. */
| 298 | |
| 299 | /* sfu: set first unset. */ |
| 300 | static inline size_t |
| 301 | bitmap_sfu(bitmap_t *bitmap, const bitmap_info_t *binfo) { |
| 302 | size_t bit; |
| 303 | bitmap_t g; |
| 304 | unsigned i; |
| 305 | |
| 306 | assert(!bitmap_full(bitmap, binfo)); |
| 307 | |
| 308 | #ifdef BITMAP_USE_TREE |
| 309 | i = binfo->nlevels - 1; |
| 310 | g = bitmap[binfo->levels[i].group_offset]; |
| 311 | bit = ffs_lu(g) - 1; |
| 312 | while (i > 0) { |
| 313 | i--; |
| 314 | g = bitmap[binfo->levels[i].group_offset + bit]; |
| 315 | bit = (bit << LG_BITMAP_GROUP_NBITS) + (ffs_lu(g) - 1); |
| 316 | } |
| 317 | #else |
| 318 | i = 0; |
| 319 | g = bitmap[0]; |
| 320 | while ((bit = ffs_lu(g)) == 0) { |
| 321 | i++; |
| 322 | g = bitmap[i]; |
| 323 | } |
| 324 | bit = (i << LG_BITMAP_GROUP_NBITS) + (bit - 1); |
| 325 | #endif |
| 326 | bitmap_set(bitmap, binfo, bit); |
| 327 | return bit; |
| 328 | } |
| 329 | |
| 330 | static inline void |
| 331 | bitmap_unset(bitmap_t *bitmap, const bitmap_info_t *binfo, size_t bit) { |