41 #define DEFAULT_SLAB_LEN (16*1024)
89 ocs_array_t *array = NULL;
96 ocs_log_err(NULL,
"Error: size exceeds slab length\n");
100 array = ocs_malloc(os,
sizeof(*array), OCS_M_ZERO | OCS_M_NOWAIT);
107 array->count = count;
108 array->elems_per_row =
slab_len / size;
109 array->n_rows = (count + array->elems_per_row - 1) / array->elems_per_row;
110 array->bytes_per_row = array->elems_per_row * array->size;
112 array->array_rows_len = array->n_rows *
sizeof(*array->array_rows);
113 array->array_rows = ocs_malloc(os, array->array_rows_len, OCS_M_ZERO | OCS_M_NOWAIT);
114 if (array->array_rows == NULL) {
118 for (i = 0; i < array->n_rows; i++) {
119 array->array_rows[i] = ocs_malloc(os, array->bytes_per_row, OCS_M_ZERO | OCS_M_NOWAIT);
120 if (array->array_rows[i] == NULL) {
144 if (array->array_rows != NULL) {
145 for (i = 0; i < array->n_rows; i++) {
146 if (array->array_rows[i] != NULL) {
147 ocs_free(array->os, array->array_rows[i], array->bytes_per_row);
150 ocs_free(array->os, array->array_rows, array->array_rows_len);
152 ocs_free(array->os, array,
sizeof(*array));
170 if (idx < array->count) {
171 uint32_t row = idx / array->elems_per_row;
172 uint32_t offset = idx % array->elems_per_row;
173 entry = ((uint8_t*)array->array_rows[row]) + (offset * array->size);
242 va = ocs_malloc(os,
sizeof(*va), OCS_M_ZERO | OCS_M_NOWAIT);
245 va->array_count = array_count;
246 va->array = ocs_malloc(os,
sizeof(*va->array) * va->array_count, OCS_M_ZERO | OCS_M_NOWAIT);
247 if (va->array != NULL) {
249 ocs_lock_init(os, &va->lock,
"varray:%p", va);
251 ocs_free(os, va,
sizeof(*va));
271 ocs_lock_free(&va->lock);
272 if (va->array != NULL) {
273 ocs_free(va->os, va->array,
sizeof(*va->array) * va->array_count);
275 ocs_free(va->os, va,
sizeof(*va));
295 if (va->entry_count < va->array_count) {
296 va->array[va->entry_count++] = entry;
299 ocs_unlock(&va->lock);
318 ocs_unlock(&va->lock);
340 ocs_unlock(&va->lock);
361 rval = va->array[va->next_index];
362 if (++va->next_index >= va->entry_count) {
395 ocs_unlock(&va->lock);
413 rc = va->entry_count;
414 ocs_unlock(&va->lock);
Void pointer array structure.
void * _ocs_varray_iter_next(ocs_varray_t *va)
Return next entry from a void pointer array.
uint32_t ocs_array_get_size(ocs_array_t *array)
Return size of array elements in bytes.
void ocs_varray_iter_reset(ocs_varray_t *va)
Reset the void pointer array iterator.
void ocs_varray_unlock(ocs_varray_t *va)
Release void pointer array lock.
void ocs_varray_lock(ocs_varray_t *va)
Take void pointer array lock.
ocs_array_t * ocs_array_alloc(ocs_os_handle_t os, uint32_t size, uint32_t count)
Allocate an array object.
void ocs_array_free(ocs_array_t *array)
Free an array object.
uint32_t ocs_array_get_count(ocs_array_t *array)
Return number of elements in an array.
uint32_t ocs_varray_get_count(ocs_varray_t *va)
Return entry count for a void pointer array.
void ocs_array_set_slablen(uint32_t len)
Set array slab allocation length.
void * ocs_varray_iter_next(ocs_varray_t *va)
Return next entry from a void pointer array.
void ocs_varray_free(ocs_varray_t *va)
Free a void pointer array.
int32_t ocs_varray_add(ocs_varray_t *va, void *entry)
Add an entry to a void pointer array.
void * ocs_array_get(ocs_array_t *array, uint32_t idx)
Return reference to an element of an array object.
ocs_varray_t * ocs_varray_alloc(ocs_os_handle_t os, uint32_t array_count)
Allocate a void pointer array.