define ffzl utility function

pull/50/head
Daniel Micay 2018-08-25 03:09:09 -04:00
parent f08d4d31db
commit ec78add6ab
2 changed files with 6 additions and 2 deletions

View File

@ -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
View File

@ -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