Lines Matching refs:bitarray
29 static void setup_bundle_data(sys_bitarray_t *bitarray, in setup_bundle_data() argument
33 bd->sidx = offset / bundle_bitness(bitarray); in setup_bundle_data()
34 bd->soff = offset % bundle_bitness(bitarray); in setup_bundle_data()
36 bd->eidx = (offset + num_bits - 1) / bundle_bitness(bitarray); in setup_bundle_data()
37 bd->eoff = (offset + num_bits - 1) % bundle_bitness(bitarray); in setup_bundle_data()
65 static bool match_region(sys_bitarray_t *bitarray, size_t offset, in match_region() argument
76 setup_bundle_data(bitarray, bd, offset, num_bits); in match_region()
79 bundle = bitarray->bundles[bd->sidx]; in match_region()
98 bundle = bitarray->bundles[bd->sidx]; in match_region()
111 bundle = bitarray->bundles[bd->eidx]; in match_region()
128 bundle = bitarray->bundles[idx]; in match_region()
154 bundle_bitness(bitarray); in match_region()
172 static void set_region(sys_bitarray_t *bitarray, size_t offset, in set_region() argument
181 setup_bundle_data(bitarray, bd, offset, num_bits); in set_region()
187 bitarray->bundles[bd->sidx] |= bd->smask; in set_region()
189 bitarray->bundles[bd->sidx] &= ~bd->smask; in set_region()
198 bitarray->bundles[bd->sidx] |= bd->smask; in set_region()
199 bitarray->bundles[bd->eidx] |= bd->emask; in set_region()
201 bitarray->bundles[idx] = ~0U; in set_region()
204 bitarray->bundles[bd->sidx] &= ~bd->smask; in set_region()
205 bitarray->bundles[bd->eidx] &= ~bd->emask; in set_region()
207 bitarray->bundles[idx] = 0U; in set_region()
213 int sys_bitarray_popcount_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset, in sys_bitarray_popcount_region() argument
221 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_popcount_region()
222 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_popcount_region()
224 key = k_spin_lock(&bitarray->lock); in sys_bitarray_popcount_region()
226 if (num_bits == 0 || offset + num_bits > bitarray->num_bits) { in sys_bitarray_popcount_region()
236 setup_bundle_data(bitarray, &bd, offset, num_bits); in sys_bitarray_popcount_region()
240 *count = POPCOUNT(bitarray->bundles[bd.sidx] & bd.smask); in sys_bitarray_popcount_region()
248 *count += POPCOUNT(bitarray->bundles[bd.sidx] & bd.smask); in sys_bitarray_popcount_region()
249 *count += POPCOUNT(bitarray->bundles[bd.eidx] & bd.emask); in sys_bitarray_popcount_region()
251 *count += POPCOUNT(bitarray->bundles[idx]); in sys_bitarray_popcount_region()
258 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_popcount_region()
320 int sys_bitarray_set_bit(sys_bitarray_t *bitarray, size_t bit) in sys_bitarray_set_bit() argument
326 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_set_bit()
327 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_set_bit()
329 key = k_spin_lock(&bitarray->lock); in sys_bitarray_set_bit()
331 if (bit >= bitarray->num_bits) { in sys_bitarray_set_bit()
336 idx = bit / bundle_bitness(bitarray); in sys_bitarray_set_bit()
337 off = bit % bundle_bitness(bitarray); in sys_bitarray_set_bit()
339 bitarray->bundles[idx] |= BIT(off); in sys_bitarray_set_bit()
344 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_set_bit()
348 int sys_bitarray_clear_bit(sys_bitarray_t *bitarray, size_t bit) in sys_bitarray_clear_bit() argument
354 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_clear_bit()
355 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_clear_bit()
357 key = k_spin_lock(&bitarray->lock); in sys_bitarray_clear_bit()
359 if (bit >= bitarray->num_bits) { in sys_bitarray_clear_bit()
364 idx = bit / bundle_bitness(bitarray); in sys_bitarray_clear_bit()
365 off = bit % bundle_bitness(bitarray); in sys_bitarray_clear_bit()
367 bitarray->bundles[idx] &= ~BIT(off); in sys_bitarray_clear_bit()
372 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_clear_bit()
376 int sys_bitarray_test_bit(sys_bitarray_t *bitarray, size_t bit, int *val) in sys_bitarray_test_bit() argument
382 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_test_bit()
383 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_test_bit()
385 key = k_spin_lock(&bitarray->lock); in sys_bitarray_test_bit()
392 if (bit >= bitarray->num_bits) { in sys_bitarray_test_bit()
397 idx = bit / bundle_bitness(bitarray); in sys_bitarray_test_bit()
398 off = bit % bundle_bitness(bitarray); in sys_bitarray_test_bit()
400 if ((bitarray->bundles[idx] & BIT(off)) != 0) { in sys_bitarray_test_bit()
409 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_test_bit()
413 int sys_bitarray_test_and_set_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val) in sys_bitarray_test_and_set_bit() argument
419 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_test_and_set_bit()
420 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_test_and_set_bit()
422 key = k_spin_lock(&bitarray->lock); in sys_bitarray_test_and_set_bit()
429 if (bit >= bitarray->num_bits) { in sys_bitarray_test_and_set_bit()
434 idx = bit / bundle_bitness(bitarray); in sys_bitarray_test_and_set_bit()
435 off = bit % bundle_bitness(bitarray); in sys_bitarray_test_and_set_bit()
437 if ((bitarray->bundles[idx] & BIT(off)) != 0) { in sys_bitarray_test_and_set_bit()
443 bitarray->bundles[idx] |= BIT(off); in sys_bitarray_test_and_set_bit()
448 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_test_and_set_bit()
452 int sys_bitarray_test_and_clear_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val) in sys_bitarray_test_and_clear_bit() argument
458 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_test_and_clear_bit()
459 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_test_and_clear_bit()
461 key = k_spin_lock(&bitarray->lock); in sys_bitarray_test_and_clear_bit()
468 if (bit >= bitarray->num_bits) { in sys_bitarray_test_and_clear_bit()
473 idx = bit / bundle_bitness(bitarray); in sys_bitarray_test_and_clear_bit()
474 off = bit % bundle_bitness(bitarray); in sys_bitarray_test_and_clear_bit()
476 if ((bitarray->bundles[idx] & BIT(off)) != 0) { in sys_bitarray_test_and_clear_bit()
482 bitarray->bundles[idx] &= ~BIT(off); in sys_bitarray_test_and_clear_bit()
487 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_test_and_clear_bit()
491 int sys_bitarray_alloc(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_alloc() argument
501 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_alloc()
502 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_alloc()
504 key = k_spin_lock(&bitarray->lock); in sys_bitarray_alloc()
511 if ((num_bits == 0) || (num_bits > bitarray->num_bits)) { in sys_bitarray_alloc()
516 if (bitarray->num_bits <= 32) { in sys_bitarray_alloc()
519 off = bitmask_find_gap(bitarray->bundles[0], num_bits, bitarray->num_bits, false); in sys_bitarray_alloc()
523 bitarray->bundles[0] |= BIT_MASK(num_bits) << off; in sys_bitarray_alloc()
538 for (size_t idx = 0; idx < bitarray->num_bundles; idx++) { in sys_bitarray_alloc()
539 if (~bitarray->bundles[idx] == 0U) { in sys_bitarray_alloc()
541 bit_idx += bundle_bitness(bitarray); in sys_bitarray_alloc()
545 if (bitarray->bundles[idx] != 0U) { in sys_bitarray_alloc()
547 off_start = find_lsb_set(~bitarray->bundles[idx]) - 1; in sys_bitarray_alloc()
554 off_end = bitarray->num_bits - num_bits; in sys_bitarray_alloc()
557 if (match_region(bitarray, bit_idx, num_bits, false, in sys_bitarray_alloc()
559 set_region(bitarray, bit_idx, num_bits, true, &bd); in sys_bitarray_alloc()
573 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_alloc()
577 int sys_bitarray_find_nth_set(sys_bitarray_t *bitarray, size_t n, size_t num_bits, size_t offset, in sys_bitarray_find_nth_set() argument
586 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_find_nth_set()
587 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_find_nth_set()
589 key = k_spin_lock(&bitarray->lock); in sys_bitarray_find_nth_set()
591 if (n == 0 || num_bits == 0 || offset + num_bits > bitarray->num_bits) { in sys_bitarray_find_nth_set()
598 setup_bundle_data(bitarray, &bd, offset, num_bits); in sys_bitarray_find_nth_set()
600 count = POPCOUNT(bitarray->bundles[bd.sidx] & bd.smask); in sys_bitarray_find_nth_set()
615 count = POPCOUNT(bitarray->bundles[idx]); in sys_bitarray_find_nth_set()
623 count = POPCOUNT(bitarray->bundles[bd.eidx] & bd.emask); in sys_bitarray_find_nth_set()
637 for (size_t j = 0; j <= bundle_bitness(bitarray) - 1; j++) { in sys_bitarray_find_nth_set()
638 if (bitarray->bundles[idx] & mask & BIT(j)) { in sys_bitarray_find_nth_set()
640 *found_at = idx * bundle_bitness(bitarray) + j; in sys_bitarray_find_nth_set()
648 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_find_nth_set()
652 int sys_bitarray_free(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_free() argument
660 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_free()
661 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_free()
663 key = k_spin_lock(&bitarray->lock); in sys_bitarray_free()
666 || (num_bits > bitarray->num_bits) in sys_bitarray_free()
667 || (offset >= bitarray->num_bits) in sys_bitarray_free()
668 || (off_end >= bitarray->num_bits)) { in sys_bitarray_free()
677 if (bitarray->num_bits <= 32) { in sys_bitarray_free()
680 if ((mask & bitarray->bundles[0]) != mask) { in sys_bitarray_free()
683 bitarray->bundles[0] &= ~mask; in sys_bitarray_free()
686 } else if (match_region(bitarray, offset, num_bits, true, &bd, NULL)) { in sys_bitarray_free()
687 set_region(bitarray, offset, num_bits, false, &bd); in sys_bitarray_free()
694 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_free()
698 static bool is_region_set_clear(sys_bitarray_t *bitarray, size_t num_bits, in is_region_set_clear() argument
704 k_spinlock_key_t key = k_spin_lock(&bitarray->lock); in is_region_set_clear()
706 __ASSERT_NO_MSG(bitarray != NULL); in is_region_set_clear()
707 __ASSERT_NO_MSG(bitarray->num_bits > 0); in is_region_set_clear()
710 || (num_bits > bitarray->num_bits) in is_region_set_clear()
711 || (offset >= bitarray->num_bits) in is_region_set_clear()
712 || (off_end >= bitarray->num_bits)) { in is_region_set_clear()
717 ret = match_region(bitarray, offset, num_bits, to_set, &bd, NULL); in is_region_set_clear()
720 k_spin_unlock(&bitarray->lock, key); in is_region_set_clear()
724 bool sys_bitarray_is_region_set(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_is_region_set() argument
727 return is_region_set_clear(bitarray, num_bits, offset, true); in sys_bitarray_is_region_set()
730 bool sys_bitarray_is_region_cleared(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_is_region_cleared() argument
733 return is_region_set_clear(bitarray, num_bits, offset, false); in sys_bitarray_is_region_cleared()
736 static int set_clear_region(sys_bitarray_t *bitarray, size_t num_bits, in set_clear_region() argument
741 k_spinlock_key_t key = k_spin_lock(&bitarray->lock); in set_clear_region()
743 __ASSERT_NO_MSG(bitarray != NULL); in set_clear_region()
744 __ASSERT_NO_MSG(bitarray->num_bits > 0); in set_clear_region()
747 || (num_bits > bitarray->num_bits) in set_clear_region()
748 || (offset >= bitarray->num_bits) in set_clear_region()
749 || (off_end >= bitarray->num_bits)) { in set_clear_region()
754 set_region(bitarray, offset, num_bits, to_set, NULL); in set_clear_region()
758 k_spin_unlock(&bitarray->lock, key); in set_clear_region()
762 int sys_bitarray_test_and_set_region(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_test_and_set_region() argument
769 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_test_and_set_region()
770 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_test_and_set_region()
773 k_spinlock_key_t key = k_spin_lock(&bitarray->lock); in sys_bitarray_test_and_set_region()
777 || (num_bits > bitarray->num_bits) in sys_bitarray_test_and_set_region()
778 || (offset >= bitarray->num_bits) in sys_bitarray_test_and_set_region()
779 || (off_end >= bitarray->num_bits)) { in sys_bitarray_test_and_set_region()
784 region_clear = match_region(bitarray, offset, num_bits, !to_set, &bd, NULL); in sys_bitarray_test_and_set_region()
786 set_region(bitarray, offset, num_bits, to_set, &bd); in sys_bitarray_test_and_set_region()
793 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_test_and_set_region()
797 int sys_bitarray_set_region(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_set_region() argument
800 return set_clear_region(bitarray, num_bits, offset, true); in sys_bitarray_set_region()
803 int sys_bitarray_clear_region(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_clear_region() argument
806 return set_clear_region(bitarray, num_bits, offset, false); in sys_bitarray_clear_region()