From c78f9cf91c7efa2e4b56550fb4c9c405a64a1a28 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Thu, 7 May 2026 08:54:18 +0000 Subject: [PATCH] feat: add vfreeze/vthaw slots to intf_varray_t; designated initializers (P0-0b) rtti header already present at rtti-0.0.2 with vfreeze_fn_t, vthaw_fn_t, retain_fn_t, and the two new slots in intf_varray_t. No header modification needed. Convert intf_varray_t compound-literal initializers in zarray.c and kvmgr.c to designated style with explicit .vfreeze = NULL and .vthaw = NULL slots. kv.c has no intf_varray_t initializer. Add test_zarray_cow.c with test_freeze_thaw_slots_exist which verifies the struct layout has the slots accessible and that they are NULL until P0-2 wires the real implementations. Wire test into meson.build and test.c. Full clean rebuild confirmed: 27/28 targets linked, no new test failures. Only the 4 pre-existing failures remain. --- src/lib/kvmgr.c | 4 +++- src/lib/meson.build | 1 + src/lib/testsuite/test.c | 2 ++ src/lib/testsuite/test_zarray_cow.c | 35 +++++++++++++++++++++++++++++ src/lib/zarray.c | 4 +++- 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/lib/testsuite/test_zarray_cow.c diff --git a/src/lib/kvmgr.c b/src/lib/kvmgr.c index 0525295..69c7643 100644 --- a/src/lib/kvmgr.c +++ b/src/lib/kvmgr.c @@ -290,7 +290,9 @@ typeinfo_t xkvmgr_type = { .vget_vec = (vget_vec_fn_t)xkvmgr_get_vec, .vput = (vput_fn_t)xkvmgr_put, .vput_vec = (vput_vec_fn_t)xkvmgr_put_vec, - .vclear = (vclear_fn_t)NULL }, + .vclear = (vclear_fn_t)NULL, + .vfreeze = NULL, /* wired in P0-2 */ + .vthaw = NULL /* wired in P0-2 */ }, .iter = &(intf_iterator_t) { .make = (iter_make_fn_t)xkvmgr_make_iter, .next = (iter_next_fn_t)xkvmgr_iter_next, diff --git a/src/lib/meson.build b/src/lib/meson.build index 8503f2b..1da3de0 100644 --- a/src/lib/meson.build +++ b/src/lib/meson.build @@ -163,6 +163,7 @@ libxce_test_src = ['testsuite/test.c', 'testsuite/test_wobj.c', 'testsuite/test_qobj.c', 'testsuite/test_request.c', + 'testsuite/test_zarray_cow.c', ] libxce_test_deps = [libxce_deps, librtti_dep, unity_dep, libxce_dep] diff --git a/src/lib/testsuite/test.c b/src/lib/testsuite/test.c index 760e5b0..333ce3e 100644 --- a/src/lib/testsuite/test.c +++ b/src/lib/testsuite/test.c @@ -29,6 +29,7 @@ extern void test_jobobj(void); extern void test_qobj(void); extern void test_wobj(void); extern void test_request(void); +extern void test_zarray_cow(void); void setUp(void) { return; } @@ -127,6 +128,7 @@ int main(int argc, char* argv[]) TEST(test_wobj); TEST(test_qobj); TEST(test_request); + TEST(test_zarray_cow); return UNITY_END(); } diff --git a/src/lib/testsuite/test_zarray_cow.c b/src/lib/testsuite/test_zarray_cow.c new file mode 100644 index 0000000..d6beef6 --- /dev/null +++ b/src/lib/testsuite/test_zarray_cow.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include + +#include "zarray.h" + +/* xzarray_type is defined in zarray.c */ +extern typeinfo_t xzarray_type; + +static void test_freeze_thaw_slots_exist(void) +{ + /* After P0-0b, intf_varray_t has vfreeze and vthaw slots. + * They are NULL until P0-2 wires the implementations. */ + const intf_varray_t* iface + = (const intf_varray_t*)xzarray_type.interfaces.varray; + + TEST_ASSERT_NOT_NULL(iface); + + /* Access slots without crash — verifies struct layout has them */ + (void)iface->vfreeze; + (void)iface->vthaw; + + /* Slots must be NULL until P0-2 wires the real implementations */ + TEST_ASSERT_NULL(iface->vfreeze); + TEST_ASSERT_NULL(iface->vthaw); + + printf("test_freeze_thaw_slots_exist: PASS\n"); +} + +void test_zarray_cow(void) +{ + printf("\n>> zarray COW interface slot test\n\n"); + RUN_TEST(test_freeze_thaw_slots_exist); +} diff --git a/src/lib/zarray.c b/src/lib/zarray.c index 32133a7..e632416 100644 --- a/src/lib/zarray.c +++ b/src/lib/zarray.c @@ -668,7 +668,9 @@ typeinfo_t xzarray_type = { .vget_vec = (vget_vec_fn_t)xzarray_get_vec, .vput = (vput_fn_t)xzarray_put, .vput_vec = (vput_vec_fn_t)xzarray_put_vec, - .vclear = (vclear_fn_t)xzarray_clear }, + .vclear = (vclear_fn_t)xzarray_clear, + .vfreeze = NULL, /* wired in P0-2 */ + .vthaw = NULL /* wired in P0-2 */ }, .iter = &(intf_iterator_t) { .make = (iter_make_fn_t)xzarray_make_iter, .next = (iter_next_fn_t)xzarray_iter_next,