From 7212ba170d8db040ac99d0fb47c7b1df70df6e11 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Fri, 24 Apr 2026 16:59:51 +0800 Subject: [PATCH] add cow support of varray and version 0.0.2 --- include/rtti/typeinfo.h | 9 +++++++++ meson.build | 2 +- nixSupport/librtti.nix | 2 +- src/meson.build | 2 +- src/varray.c | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/include/rtti/typeinfo.h b/include/rtti/typeinfo.h index e82f218..7277b53 100644 --- a/include/rtti/typeinfo.h +++ b/include/rtti/typeinfo.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -170,6 +171,10 @@ typedef int (*vget_vec_fn_t)(meta_obj_t*, int, int*, void**); typedef int (*vput_fn_t)(meta_obj_t*, int, void*); typedef int (*vput_vec_fn_t)(meta_obj_t*, int, int*, void**); typedef int (*vclear_fn_t)(meta_obj_t*, int); +/* COW snapshot support — freeze/thaw for application-level copy-on-write */ +typedef bool (*retain_fn_t)(void*, void*); +typedef int (*vfreeze_fn_t)(meta_obj_t*); +typedef int (*vthaw_fn_t)(meta_obj_t*, retain_fn_t, void*); typedef struct { vstore_fn_t vstore; @@ -178,6 +183,8 @@ typedef struct { vput_fn_t vput; vput_vec_fn_t vput_vec; vclear_fn_t vclear; + vfreeze_fn_t vfreeze; /* NEW — freeze (O(1) ptr swap) */ + vthaw_fn_t vthaw; /* NEW — thaw + merge + GC */ } intf_varray_t; /* attrs API */ @@ -257,6 +264,8 @@ extern int vget_vec(var, int, int*, void**); extern int vput(var, int, void*); extern int vput_vec(var, int, int*, void**); extern int vclear(var, int); +extern int vfreeze(var); +extern int vthaw(var, retain_fn_t, void*); extern int attr_get(var, void*, void**); extern int attr_set(var, void*, void*); diff --git a/meson.build b/meson.build index 9717b72..c342434 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('librtti', ['c'], - version: '0.0.1', + version: '0.0.2', meson_version: '>=1.5', default_options: [ 'c_std=gnu17']) diff --git a/nixSupport/librtti.nix b/nixSupport/librtti.nix index b992879..3e10832 100644 --- a/nixSupport/librtti.nix +++ b/nixSupport/librtti.nix @@ -9,7 +9,7 @@ stdenv.mkDerivation { pname = "rtti"; - version = "0.0.1"; + version = "0.0.2"; src = ./..; diff --git a/src/meson.build b/src/meson.build index f9630b2..b1f69fe 100644 --- a/src/meson.build +++ b/src/meson.build @@ -45,4 +45,4 @@ dep_librtti = declare_dependency(link_with: librtti) pkg.generate(librtti, name: 'librtti', description: 'runtime type information library for c', - version: '0.0.1') + version: '0.0.2') diff --git a/src/varray.c b/src/varray.c index 9dd883e..907035d 100644 --- a/src/varray.c +++ b/src/varray.c @@ -130,3 +130,39 @@ int vclear(var v, int idx) return method(obj, idx); } + +int vfreeze(var v) +{ + meta_obj_t* obj = NULL; + vfreeze_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, varray, vfreeze); + if (method == NULL) { + return -EINVAL; + } + + return method(obj); +} + +int vthaw(var v, retain_fn_t fn, void* arg) +{ + meta_obj_t* obj = NULL; + vthaw_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, varray, vthaw); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, fn, arg); +}