add cow support of varray and version 0.0.2
This commit is contained in:
parent
10c32f769b
commit
7212ba170d
5 changed files with 48 additions and 3 deletions
|
|
@ -5,6 +5,7 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
@ -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_fn_t)(meta_obj_t*, int, void*);
|
||||||
typedef int (*vput_vec_fn_t)(meta_obj_t*, int, int*, void**);
|
typedef int (*vput_vec_fn_t)(meta_obj_t*, int, int*, void**);
|
||||||
typedef int (*vclear_fn_t)(meta_obj_t*, int);
|
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 {
|
typedef struct {
|
||||||
vstore_fn_t vstore;
|
vstore_fn_t vstore;
|
||||||
|
|
@ -178,6 +183,8 @@ typedef struct {
|
||||||
vput_fn_t vput;
|
vput_fn_t vput;
|
||||||
vput_vec_fn_t vput_vec;
|
vput_vec_fn_t vput_vec;
|
||||||
vclear_fn_t vclear;
|
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;
|
} intf_varray_t;
|
||||||
|
|
||||||
/* attrs API */
|
/* attrs API */
|
||||||
|
|
@ -257,6 +264,8 @@ extern int vget_vec(var, int, int*, void**);
|
||||||
extern int vput(var, int, void*);
|
extern int vput(var, int, void*);
|
||||||
extern int vput_vec(var, int, int*, void**);
|
extern int vput_vec(var, int, int*, void**);
|
||||||
extern int vclear(var, int);
|
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_get(var, void*, void**);
|
||||||
extern int attr_set(var, void*, void*);
|
extern int attr_set(var, void*, void*);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
project('librtti',
|
project('librtti',
|
||||||
['c'],
|
['c'],
|
||||||
version: '0.0.1',
|
version: '0.0.2',
|
||||||
meson_version: '>=1.5',
|
meson_version: '>=1.5',
|
||||||
default_options: [
|
default_options: [
|
||||||
'c_std=gnu17'])
|
'c_std=gnu17'])
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
|
|
||||||
pname = "rtti";
|
pname = "rtti";
|
||||||
version = "0.0.1";
|
version = "0.0.2";
|
||||||
|
|
||||||
src = ./..;
|
src = ./..;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,4 +45,4 @@ dep_librtti = declare_dependency(link_with: librtti)
|
||||||
pkg.generate(librtti,
|
pkg.generate(librtti,
|
||||||
name: 'librtti',
|
name: 'librtti',
|
||||||
description: 'runtime type information library for c',
|
description: 'runtime type information library for c',
|
||||||
version: '0.0.1')
|
version: '0.0.2')
|
||||||
|
|
|
||||||
36
src/varray.c
36
src/varray.c
|
|
@ -130,3 +130,39 @@ int vclear(var v, int idx)
|
||||||
|
|
||||||
return method(obj, 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);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue