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()
524 for (size_t idx = 0; idx < bitarray->num_bundles; idx++) { in sys_bitarray_alloc()
525 if (~bitarray->bundles[idx] == 0U) { in sys_bitarray_alloc()
527 bit_idx += bundle_bitness(bitarray); in sys_bitarray_alloc()
531 if (bitarray->bundles[idx] != 0U) { in sys_bitarray_alloc()
533 off_start = find_lsb_set(~bitarray->bundles[idx]) - 1; in sys_bitarray_alloc()
540 off_end = bitarray->num_bits - num_bits; in sys_bitarray_alloc()
543 if (match_region(bitarray, bit_idx, num_bits, false, in sys_bitarray_alloc()
545 set_region(bitarray, bit_idx, num_bits, true, &bd); in sys_bitarray_alloc()
559 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_alloc()
563 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
572 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_find_nth_set()
573 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_find_nth_set()
575 key = k_spin_lock(&bitarray->lock); in sys_bitarray_find_nth_set()
577 if (n == 0 || num_bits == 0 || offset + num_bits > bitarray->num_bits) { in sys_bitarray_find_nth_set()
584 setup_bundle_data(bitarray, &bd, offset, num_bits); in sys_bitarray_find_nth_set()
586 count = POPCOUNT(bitarray->bundles[bd.sidx] & bd.smask); in sys_bitarray_find_nth_set()
601 count = POPCOUNT(bitarray->bundles[idx]); in sys_bitarray_find_nth_set()
609 count = POPCOUNT(bitarray->bundles[bd.eidx] & bd.emask); in sys_bitarray_find_nth_set()
623 for (int j = 0; j <= bundle_bitness(bitarray) - 1; j++) { in sys_bitarray_find_nth_set()
624 if (bitarray->bundles[idx] & mask & BIT(j)) { in sys_bitarray_find_nth_set()
626 *found_at = idx * bundle_bitness(bitarray) + j; in sys_bitarray_find_nth_set()
634 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_find_nth_set()
638 int sys_bitarray_free(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_free() argument
646 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_free()
647 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_free()
649 key = k_spin_lock(&bitarray->lock); in sys_bitarray_free()
652 || (num_bits > bitarray->num_bits) in sys_bitarray_free()
653 || (offset >= bitarray->num_bits) in sys_bitarray_free()
654 || (off_end >= bitarray->num_bits)) { in sys_bitarray_free()
663 if (match_region(bitarray, offset, num_bits, true, &bd, NULL)) { in sys_bitarray_free()
664 set_region(bitarray, offset, num_bits, false, &bd); in sys_bitarray_free()
671 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_free()
675 static bool is_region_set_clear(sys_bitarray_t *bitarray, size_t num_bits, in is_region_set_clear() argument
681 k_spinlock_key_t key = k_spin_lock(&bitarray->lock); in is_region_set_clear()
683 __ASSERT_NO_MSG(bitarray != NULL); in is_region_set_clear()
684 __ASSERT_NO_MSG(bitarray->num_bits > 0); in is_region_set_clear()
687 || (num_bits > bitarray->num_bits) in is_region_set_clear()
688 || (offset >= bitarray->num_bits) in is_region_set_clear()
689 || (off_end >= bitarray->num_bits)) { in is_region_set_clear()
694 ret = match_region(bitarray, offset, num_bits, to_set, &bd, NULL); in is_region_set_clear()
697 k_spin_unlock(&bitarray->lock, key); in is_region_set_clear()
701 bool sys_bitarray_is_region_set(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_is_region_set() argument
704 return is_region_set_clear(bitarray, num_bits, offset, true); in sys_bitarray_is_region_set()
707 bool sys_bitarray_is_region_cleared(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_is_region_cleared() argument
710 return is_region_set_clear(bitarray, num_bits, offset, false); in sys_bitarray_is_region_cleared()
713 static int set_clear_region(sys_bitarray_t *bitarray, size_t num_bits, in set_clear_region() argument
718 k_spinlock_key_t key = k_spin_lock(&bitarray->lock); in set_clear_region()
720 __ASSERT_NO_MSG(bitarray != NULL); in set_clear_region()
721 __ASSERT_NO_MSG(bitarray->num_bits > 0); in set_clear_region()
724 || (num_bits > bitarray->num_bits) in set_clear_region()
725 || (offset >= bitarray->num_bits) in set_clear_region()
726 || (off_end >= bitarray->num_bits)) { in set_clear_region()
731 set_region(bitarray, offset, num_bits, to_set, NULL); in set_clear_region()
735 k_spin_unlock(&bitarray->lock, key); in set_clear_region()
739 int sys_bitarray_test_and_set_region(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_test_and_set_region() argument
746 __ASSERT_NO_MSG(bitarray != NULL); in sys_bitarray_test_and_set_region()
747 __ASSERT_NO_MSG(bitarray->num_bits > 0); in sys_bitarray_test_and_set_region()
750 k_spinlock_key_t key = k_spin_lock(&bitarray->lock); in sys_bitarray_test_and_set_region()
754 || (num_bits > bitarray->num_bits) in sys_bitarray_test_and_set_region()
755 || (offset >= bitarray->num_bits) in sys_bitarray_test_and_set_region()
756 || (off_end >= bitarray->num_bits)) { in sys_bitarray_test_and_set_region()
761 region_clear = match_region(bitarray, offset, num_bits, !to_set, &bd, NULL); in sys_bitarray_test_and_set_region()
763 set_region(bitarray, offset, num_bits, to_set, &bd); in sys_bitarray_test_and_set_region()
770 k_spin_unlock(&bitarray->lock, key); in sys_bitarray_test_and_set_region()
774 int sys_bitarray_set_region(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_set_region() argument
777 return set_clear_region(bitarray, num_bits, offset, true); in sys_bitarray_set_region()
780 int sys_bitarray_clear_region(sys_bitarray_t *bitarray, size_t num_bits, in sys_bitarray_clear_region() argument
783 return set_clear_region(bitarray, num_bits, offset, false); in sys_bitarray_clear_region()