Lines Matching refs:array

42 static kern_return_t array_init(KXLDArray *array, size_t itemsize, u_int nitems);
45 static u_int reinit_pools(KXLDArray *array, u_int nitems);
50 kxld_array_init(KXLDArray *array, size_t itemsize, u_int nitems) in kxld_array_init() argument
58 check(array); in kxld_array_init()
61 kxld_array_reset(array); in kxld_array_init()
75 if (array->npools) { in kxld_array_init()
77 array->pool_maxitems = (u_int) (array->pool_capacity / itemsize); in kxld_array_init()
78 array->maxitems = 0; in kxld_array_init()
79 STAILQ_FOREACH(srcpool, &array->pools, entries) { in kxld_array_init()
80 array->maxitems += array->pool_maxitems; in kxld_array_init()
87 if (array->maxitems < nitems) { in kxld_array_init()
88 STAILQ_FOREACH_SAFE(srcpool, &array->pools, entries, tmp) { in kxld_array_init()
89 STAILQ_REMOVE(&array->pools, srcpool, kxld_array_pool, entries); in kxld_array_init()
92 srcpool_capacity = array->pool_capacity; in kxld_array_init()
93 bzero(array, sizeof(*array)); in kxld_array_init()
95 nitems = reinit_pools(array, nitems); in kxld_array_init()
100 array->itemsize = itemsize; in kxld_array_init()
108 if (array->maxitems == 0) { in kxld_array_init()
109 rval = array_init(array, itemsize, nitems); in kxld_array_init()
112 dstpool = STAILQ_FIRST(&array->pools); in kxld_array_init()
127 kxld_array_deinit(array); in kxld_array_init()
138 array_init(KXLDArray *array, size_t itemsize, u_int nitems) in array_init() argument
144 require_action(array->npools < 2, finish, rval = KERN_INVALID_ARGUMENT); in array_init()
146 array->itemsize = itemsize; in array_init()
148 pool = STAILQ_FIRST(&array->pools); in array_init()
150 require_action(itemsize * nitems < array->pool_capacity, in array_init()
152 require_action(array->npools == 1, finish, rval = KERN_FAILURE); in array_init()
153 bzero(pool->buffer, array->pool_capacity); in array_init()
155 array->pool_capacity = round_page(array->itemsize * nitems); in array_init()
157 pool = pool_create(array->pool_capacity); in array_init()
159 STAILQ_INSERT_HEAD(&array->pools, pool, entries); in array_init()
163 array->pool_maxitems = (u_int) (array->pool_capacity / array->itemsize); in array_init()
164 array->maxitems = array->pool_maxitems; in array_init()
165 array->nitems = nitems; in array_init()
166 array->npools = 1; in array_init()
255 kxld_array_reset(KXLDArray *array) in kxld_array_reset() argument
259 if (array) { in kxld_array_reset()
260 STAILQ_FOREACH(pool, &array->pools, entries) { in kxld_array_reset()
263 array->nitems = 0; in kxld_array_reset()
270 kxld_array_clear(KXLDArray *array) in kxld_array_clear() argument
274 if (array) { in kxld_array_clear()
275 kxld_array_reset(array); in kxld_array_clear()
276 STAILQ_FOREACH(pool, &array->pools, entries) { in kxld_array_clear()
277 bzero(pool->buffer, array->pool_capacity); in kxld_array_clear()
285 kxld_array_deinit(KXLDArray *array) in kxld_array_deinit() argument
289 if (array) { in kxld_array_deinit()
290 STAILQ_FOREACH_SAFE(pool, &array->pools, entries, tmp) { in kxld_array_deinit()
291 STAILQ_REMOVE(&array->pools, pool, kxld_array_pool, entries); in kxld_array_deinit()
292 pool_destroy(pool, array->pool_capacity); in kxld_array_deinit()
294 bzero(array, sizeof(*array)); in kxld_array_deinit()
301 kxld_array_get_item(const KXLDArray *array, u_int idx) in kxld_array_get_item() argument
306 check(array); in kxld_array_get_item()
308 if (idx >= array->nitems) { in kxld_array_get_item()
312 STAILQ_FOREACH(pool, &array->pools, entries) { in kxld_array_get_item()
314 item = (void *) (pool->buffer + (array->itemsize * idx)); in kxld_array_get_item()
318 idx -= array->pool_maxitems; in kxld_array_get_item()
328 kxld_array_get_slot(const KXLDArray *array, u_int idx) in kxld_array_get_slot() argument
333 check(array); in kxld_array_get_slot()
335 if (idx >= array->maxitems) { in kxld_array_get_slot()
339 STAILQ_FOREACH(pool, &array->pools, entries) { in kxld_array_get_slot()
340 if (idx < array->pool_maxitems) { in kxld_array_get_slot()
341 item = (void *) (pool->buffer + (array->itemsize * idx)); in kxld_array_get_slot()
345 idx -= array->pool_maxitems; in kxld_array_get_slot()
355 kxld_array_get_index(const KXLDArray *array, const void *item, u_int *_idx) in kxld_array_get_index() argument
364 check(array); in kxld_array_get_index()
370 STAILQ_FOREACH(pool, &array->pools, entries) { in kxld_array_get_index()
371 if (pool->buffer <= it && it < pool->buffer + array->pool_capacity) { in kxld_array_get_index()
373 idx = (u_int) (diff / array->itemsize); in kxld_array_get_index()
382 base_idx += array->pool_maxitems; in kxld_array_get_index()
393 kxld_array_resize(KXLDArray *array, u_int nitems) in kxld_array_resize() argument
400 while (nitems > array->maxitems) { in kxld_array_resize()
401 pool = pool_create(array->pool_capacity); in kxld_array_resize()
404 STAILQ_INSERT_TAIL(&array->pools, pool, entries); in kxld_array_resize()
406 array->maxitems += array->pool_maxitems; in kxld_array_resize()
407 array->npools += 1; in kxld_array_resize()
410 nitems = reinit_pools(array, nitems); in kxld_array_resize()
424 reinit_pools(KXLDArray *array, u_int nitems) in reinit_pools() argument
432 STAILQ_FOREACH(pool, &array->pools, entries) { in reinit_pools()
433 if (pool_nitems > array->pool_maxitems) { in reinit_pools()
434 pool->nitems = array->pool_maxitems; in reinit_pools()
435 pool_nitems -= array->pool_maxitems; in reinit_pools()
441 array->nitems = nitems; in reinit_pools()
449 kxld_array_remove(KXLDArray *array, u_int idx) in kxld_array_remove() argument
457 check(array); in kxld_array_remove()
459 if (idx >= array->nitems) { in kxld_array_remove()
467 require_action(array->npools < 2 || array->nitems < array->pool_maxitems, in kxld_array_remove()
470 pool = STAILQ_FIRST(&array->pools); in kxld_array_remove()
474 dst += idx * array->itemsize; in kxld_array_remove()
477 src += ((idx + 1) * array->itemsize); in kxld_array_remove()
480 memmove(dst, src, array->itemsize * nitems); in kxld_array_remove()
483 --array->nitems; in kxld_array_remove()
486 dst += pool->nitems * array->itemsize; in kxld_array_remove()
487 bzero(dst, array->itemsize); in kxld_array_remove()