define ffzl utility function
parent
f08d4d31db
commit
ec78add6ab
4
malloc.c
4
malloc.c
|
@ -264,11 +264,11 @@ static size_t get_free_slot(struct random_state *rng, size_t slots, struct slab_
|
||||||
// randomize start location for linear search (uniform random choice is too slow)
|
// randomize start location for linear search (uniform random choice is too slow)
|
||||||
uint64_t random_split = ~0UL >> get_random_size_uniform(rng, slots);
|
uint64_t random_split = ~0UL >> get_random_size_uniform(rng, slots);
|
||||||
|
|
||||||
size_t slot = __builtin_ffsl(~(masked | random_split));
|
size_t slot = ffzl(masked | random_split);
|
||||||
if (slot) {
|
if (slot) {
|
||||||
return slot - 1;
|
return slot - 1;
|
||||||
} else {
|
} else {
|
||||||
return __builtin_ffsl(~masked) - 1;
|
return ffzl(masked) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
util.h
4
util.h
|
@ -10,6 +10,10 @@
|
||||||
#define UNUSED __attribute__((unused))
|
#define UNUSED __attribute__((unused))
|
||||||
#define EXPORT __attribute__((visibility("default")))
|
#define EXPORT __attribute__((visibility("default")))
|
||||||
|
|
||||||
|
static inline int ffzl(long x) {
|
||||||
|
return __builtin_ffsl(~x);
|
||||||
|
}
|
||||||
|
|
||||||
COLD noreturn void fatal_error(const char *s);
|
COLD noreturn void fatal_error(const char *s);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue