Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
bitarray.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_SYS_BITARRAY_H_
8#define ZEPHYR_INCLUDE_SYS_BITARRAY_H_
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14#include <stddef.h>
15#include <stdint.h>
16
17#include <zephyr/kernel.h>
18#include <zephyr/sys/util.h>
19
34
36struct sys_bitarray {
37 /* Number of bits */
38 uint32_t num_bits;
39
40 /* Number of bundles */
41 uint32_t num_bundles;
42
43 /* Bundle of bits */
44 uint32_t *bundles;
45
46 /* Spinlock guarding access to this bit array */
47 struct k_spinlock lock;
48};
50
52typedef struct sys_bitarray sys_bitarray_t;
53
61#define _SYS_BITARRAY_DEFINE(name, total_bits, sba_mod) \
62 sba_mod uint32_t _sys_bitarray_bundles_##name \
63 [DIV_ROUND_UP(DIV_ROUND_UP(total_bits, 8), \
64 sizeof(uint32_t))] = {0}; \
65 sba_mod sys_bitarray_t name = { \
66 .num_bits = (total_bits), \
67 .num_bundles = DIV_ROUND_UP( \
68 DIV_ROUND_UP(total_bits, 8), sizeof(uint32_t)), \
69 .bundles = _sys_bitarray_bundles_##name, \
70 }
71
78#define SYS_BITARRAY_DEFINE(name, total_bits) \
79 _SYS_BITARRAY_DEFINE(name, total_bits,)
80
87#define SYS_BITARRAY_DEFINE_STATIC(name, total_bits) \
88 _SYS_BITARRAY_DEFINE(name, total_bits, static)
89
100int sys_bitarray_set_bit(sys_bitarray_t *bitarray, size_t bit);
101
112int sys_bitarray_clear_bit(sys_bitarray_t *bitarray, size_t bit);
113
125int sys_bitarray_test_bit(sys_bitarray_t *bitarray, size_t bit, int *val);
126
138int sys_bitarray_test_and_set_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val);
139
151int sys_bitarray_test_and_clear_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val);
152
172int sys_bitarray_alloc(sys_bitarray_t *bitarray, size_t num_bits,
173 size_t *offset);
174
189int sys_bitarray_xor(sys_bitarray_t *dst, sys_bitarray_t *other, size_t num_bits, size_t offset);
190
210int sys_bitarray_find_nth_set(sys_bitarray_t *bitarray, size_t n, size_t num_bits, size_t offset,
211 size_t *found_at);
212
227int sys_bitarray_popcount_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset,
228 size_t *count);
229
245int sys_bitarray_free(sys_bitarray_t *bitarray, size_t num_bits,
246 size_t offset);
247
261bool sys_bitarray_is_region_set(sys_bitarray_t *bitarray, size_t num_bits,
262 size_t offset);
263
277bool sys_bitarray_is_region_cleared(sys_bitarray_t *bitarray, size_t num_bits,
278 size_t offset);
279
294int sys_bitarray_set_region(sys_bitarray_t *bitarray, size_t num_bits,
295 size_t offset);
296
320 size_t offset, bool to_set);
321
336int sys_bitarray_clear_region(sys_bitarray_t *bitarray, size_t num_bits,
337 size_t offset);
338
342
343#ifdef __cplusplus
344}
345#endif
346
347#endif /* ZEPHYR_INCLUDE_SYS_BITARRAY_H_ */
int sys_bitarray_find_nth_set(sys_bitarray_t *bitarray, size_t n, size_t num_bits, size_t offset, size_t *found_at)
Find nth bit set in region.
struct sys_bitarray sys_bitarray_t
Bitarray structure.
Definition bitarray.h:52
int sys_bitarray_xor(sys_bitarray_t *dst, sys_bitarray_t *other, size_t num_bits, size_t offset)
Calculates the bit-wise XOR of two bitarrays in a region.
bool sys_bitarray_is_region_cleared(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Test if bits in a region is all cleared.
bool sys_bitarray_is_region_set(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Test if bits in a region is all set.
int sys_bitarray_test_and_clear_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val)
Test the bit and clear it.
int sys_bitarray_set_bit(sys_bitarray_t *bitarray, size_t bit)
Set a bit in a bit array.
int sys_bitarray_clear_bit(sys_bitarray_t *bitarray, size_t bit)
Clear a bit in a bit array.
int sys_bitarray_popcount_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset, size_t *count)
Count bits set in a bit array region.
int sys_bitarray_set_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Set all bits in a region.
int sys_bitarray_alloc(sys_bitarray_t *bitarray, size_t num_bits, size_t *offset)
Allocate bits in a bit array.
int sys_bitarray_clear_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Clear all bits in a region.
int sys_bitarray_test_and_set_bit(sys_bitarray_t *bitarray, size_t bit, int *prev_val)
Test the bit and set it.
int sys_bitarray_test_and_set_region(sys_bitarray_t *bitarray, size_t num_bits, size_t offset, bool to_set)
Test if all bits in a region are cleared/set and set/clear them in a single atomic operation.
int sys_bitarray_test_bit(sys_bitarray_t *bitarray, size_t bit, int *val)
Test whether a bit is set or not.
int sys_bitarray_free(sys_bitarray_t *bitarray, size_t num_bits, size_t offset)
Free bits in a bit array.
Public kernel APIs.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Misc utilities.