summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-27 12:03:52 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-27 12:03:52 -0400
commit9a7a7555c313fead21b31a82c2174da57aea3bc8 (patch)
treefacb21ee625a0fa535a1985b7306fca9eca87fe0
parentbef2087b4a68a6ac13a48020828bf95bbbad54f1 (diff)
pkbktarr: add pk_bkt_arr_clear
-rw-r--r--pkbktarr.h23
-rw-r--r--test/pkbktarr.c45
2 files changed, 66 insertions, 2 deletions
diff --git a/pkbktarr.h b/pkbktarr.h
index 0166896..ea0fab4 100644
--- a/pkbktarr.h
+++ b/pkbktarr.h
@@ -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);
{