diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-27 12:03:52 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-27 12:03:52 -0400 |
| commit | 9a7a7555c313fead21b31a82c2174da57aea3bc8 (patch) | |
| tree | facb21ee625a0fa535a1985b7306fca9eca87fe0 | |
| parent | bef2087b4a68a6ac13a48020828bf95bbbad54f1 (diff) | |
pkbktarr: add pk_bkt_arr_clear
| -rw-r--r-- | pkbktarr.h | 23 | ||||
| -rw-r--r-- | test/pkbktarr.c | 45 |
2 files changed, 66 insertions, 2 deletions
@@ -4,6 +4,9 @@ #include "./pkmem.h" /* deleteme */ #include "./pkmacros.h" /* deleteme */ +#ifndef PK_BKT_ARR_ALL_UNUSED_VAL + #define PK_BKT_ARR_ALL_UNUSED_VAL 0xFFFFFFFFFFFFFFFF +#endif #define PK_BKT_ARR_HANDLE_B_MAX 0xFFFFFF #define PK_BKT_ARR_HANDLE_I_MAX 64 @@ -26,6 +29,7 @@ struct pk_bkt_arr { }; void pk_bkt_arr_init(struct pk_bkt_arr *bkt_arr, unsigned long stride, unsigned long alignment, struct pk_bkt_arr_handle limits, struct pk_membucket *bkt_buckets, struct pk_membucket *bkt_data); +void pk_bkt_arr_clear(struct pk_bkt_arr *bkt_arr); void pk_bkt_arr_teardown(struct pk_bkt_arr *bkt_arr); struct pk_bkt_arr_handle pk_bkt_arr_new_handle(struct pk_bkt_arr *bkt_arr); void pk_bkt_arr_free_handle(struct pk_bkt_arr *bkt_arr, struct pk_bkt_arr_handle handle); @@ -89,11 +93,22 @@ void pk_bkt_arr_init(struct pk_bkt_arr *bkt_arr, unsigned long stride, unsigned bkt_arr->stride = stride; bkt_arr->alignment = alignment; bkt_arr->idx_unused = (unsigned long long *)pk_new(sizeof(unsigned long long), alignof(unsigned long long), bkt_buckets); - bkt_arr->idx_unused[0] = 0xFFFFFFFFFFFFFFFF; + bkt_arr->idx_unused[0] = PK_BKT_ARR_ALL_UNUSED_VAL; bkt_arr->bucketed_data = (void **)pk_new(sizeof(void *), alignof(void *), bkt_buckets); bkt_arr->bucketed_data[0] = pk_new(stride * limits.i, alignment, bkt_data); } +void pk_bkt_arr_clear(struct pk_bkt_arr *bkt_arr) { + unsigned int b; + bkt_arr->head_l.b = 0; + bkt_arr->head_l.i = 0; + bkt_arr->head_r.b = 0; + bkt_arr->head_r.i = 0; + for (b = 0; b < bkt_arr->reserved_buckets; ++b) { + bkt_arr->idx_unused[b] = PK_BKT_ARR_ALL_UNUSED_VAL; + } +} + void pk_bkt_arr_teardown(struct pk_bkt_arr *bkt_arr) { int b; @@ -105,6 +120,10 @@ void pk_bkt_arr_teardown(struct pk_bkt_arr *bkt_arr) pk_delete((void *)bkt_arr->idx_unused, sizeof(unsigned long long) * (bkt_arr->reserved_buckets), bkt_arr->bkt_buckets); pk_delete((void *)bkt_arr->bucketed_data, sizeof(void *) * (bkt_arr->reserved_buckets), bkt_arr->bkt_buckets); memset(bkt_arr, 0, sizeof(struct pk_bkt_arr)); + bkt_arr->bkt_buckets = NULL; + bkt_arr->bkt_data = NULL; + bkt_arr->idx_unused = NULL; + bkt_arr->bucketed_data = NULL; } struct pk_bkt_arr_handle pk_bkt_arr_new_handle(struct pk_bkt_arr *bkt_arr) @@ -145,7 +164,7 @@ struct pk_bkt_arr_handle pk_bkt_arr_new_handle(struct pk_bkt_arr *bkt_arr) new_idx_unused[b] = bkt_arr->idx_unused[b]; new_data_ptrs[b] = bkt_arr->bucketed_data[b]; } - new_idx_unused[bkt_arr->reserved_buckets - 1] = 0xFFFFFFFFFFFFFFFF; + new_idx_unused[bkt_arr->reserved_buckets - 1] = PK_BKT_ARR_ALL_UNUSED_VAL; new_data_ptrs[bkt_arr->reserved_buckets - 1] = pk_new(bkt_arr->stride * bkt_arr->limits.i, bkt_arr->alignment, bkt_arr->bkt_data); pk_delete((void *)bkt_arr->idx_unused, sizeof(unsigned long long) * (bkt_arr->reserved_buckets - 1), bkt_arr->bkt_buckets); diff --git a/test/pkbktarr.c b/test/pkbktarr.c index 529c51b..1750359 100644 --- a/test/pkbktarr.c +++ b/test/pkbktarr.c @@ -125,6 +125,51 @@ int main(int argc, char *argv[]) } test_teardown(&bkt_buckets, &bkt_data); + // test clear + test_spinup(&bkt_buckets, &bkt_data); + { + assert(bkt_buckets != nullptr); + assert(bkt_data != nullptr); + struct pk_bkt_arr arr = {0}; + struct pk_bkt_arr_handle limits; + limits.b = PK_BKT_ARR_HANDLE_B_MAX; + limits.i = PK_BKT_ARR_HANDLE_I_MAX; + pk_bkt_arr_init(&arr, sizeof(int), alignof(int), limits, bkt_buckets, bkt_data); + + struct pk_bkt_arr_handle h = pk_bkt_arr_new_handle(&arr); + if (h.b != 0) exit(1); + if (h.i != 0) exit(1); + if (arr.head_l.b != 0) exit(1); + if (arr.head_l.i != 1) exit(1); + if (arr.head_r.b != 0) exit(1); + if (arr.head_r.i != 1) exit(1); + if (bkt_buckets->allocs != 2) exit(1); + if (bkt_data->allocs != 1) exit(1); + + pk_bkt_arr_clear(&arr); + if (arr.head_l.b != 0) exit(1); + if (arr.head_l.i != 0) exit(1); + if (arr.head_r.b != 0) exit(1); + if (arr.head_r.i != 0) exit(1); + if (bkt_buckets->allocs != 2) exit(1); + if (bkt_data->allocs != 1) exit(1); + + h = pk_bkt_arr_new_handle(&arr); + if (h.b != 0) exit(1); + if (h.i != 0) exit(1); + if (arr.head_l.b != 0) exit(1); + if (arr.head_l.i != 1) exit(1); + if (arr.head_r.b != 0) exit(1); + if (arr.head_r.i != 1) exit(1); + if (bkt_buckets->allocs != 2) exit(1); + if (bkt_data->allocs != 1) exit(1); + + pk_bkt_arr_teardown(&arr); + if (bkt_buckets->allocs != 0) exit(1); + if (bkt_data->allocs != 0) exit(1); + } + test_teardown(&bkt_buckets, &bkt_data); + // test release & re-use slot test_spinup(&bkt_buckets, &bkt_data); { |
