diff --git a/sys/sys/bitset.h b/sys/sys/bitset.h --- a/sys/sys/bitset.h +++ b/sys/sys/bitset.h @@ -177,6 +177,10 @@ * or a bit index. */ +#define __BIT_ISSET_ATOMIC(_s, n, p) \ + ((atomic_load_long(&(p)->__bits[__bitset_word(_s, n)]) & \ + __bitset_mask((_s), (n))) != 0) + #define __BIT_CLR_ATOMIC(_s, n, p) \ atomic_clear_long(&(p)->__bits[__bitset_word(_s, n)], \ __bitset_mask((_s), n)) @@ -259,6 +263,27 @@ __bit; \ }) +#define __BIT_FFC_AT(_s, p, start) __extension__ ({ \ + __size_t __i; \ + long __bit, __mask; \ + \ + __mask = ~0UL << ((start) % _BITSET_BITS); \ + __bit = 0; \ + for (__i = __bitset_word((_s), (start)); \ + __i < __bitset_words((_s)); \ + __i++) { \ + if ((~(p)->__bits[__i] & __mask) != 0) { \ + __bit = ffsl(~(p)->__bits[__i] & __mask); \ + __bit += __i * _BITSET_BITS; \ + break; \ + } \ + __mask = ~0UL; \ + } \ + __bit; \ +}) + +#define __BIT_FFC(_s, p) __BIT_FFC_AT((_s), (p), 0) + #define __BIT_COUNT(_s, p) __extension__ ({ \ __size_t __i; \ long __count; \ @@ -319,6 +344,8 @@ #define BIT_COPY_STORE_REL(_s, f, t) __BIT_COPY_STORE_REL(_s, f, t) #define BIT_COUNT(_s, p) __BIT_COUNT(_s, p) #define BIT_EMPTY(_s, p) __BIT_EMPTY(_s, p) +#define BIT_FFC(_s, p) __BIT_FFC(_s, p) +#define BIT_FFC_AT(_s, p, start) __BIT_FFC_AT(_s, p, start) #define BIT_FFS(_s, p) __BIT_FFS(_s, p) #define BIT_FFS_AT(_s, p, start) __BIT_FFS_AT(_s, p, start) #define BIT_FILL(_s, p) __BIT_FILL(_s, p) @@ -328,6 +355,7 @@ #define BIT_FOREACH_ISSET(_s, i, p) __BIT_FOREACH_ISSET(_s, i, p) #define BIT_ISFULLSET(_s, p) __BIT_ISFULLSET(_s, p) #define BIT_ISSET(_s, n, p) __BIT_ISSET(_s, n, p) +#define BIT_ISSET_ATOMIC(_s, n, p) __BIT_ISSET_ATOMIC(_s, n, p) #define BIT_OR(_s, d, s) __BIT_OR(_s, d, s) #define BIT_OR2(_s, d, s1, s2) __BIT_OR2(_s, d, s1, s2) #define BIT_OR_ATOMIC(_s, d, s) __BIT_OR_ATOMIC(_s, d, s)