improve xkvmgr and testsuite for scheduler

This commit is contained in:
Rongsong Shen 2026-02-26 14:39:12 +08:00
parent 2ee87d4ee6
commit 598d381379
10 changed files with 327 additions and 64 deletions

View file

@ -430,7 +430,7 @@ static int xkvmgr_init(meta_obj_t* obj, va_list ap)
}
kv_params.nslots = params->nslots;
kv_params.datakiller = params->datakiller;
kv_params.datakiller = NULL;
switch (params->key_type) {
case KVMGR_KEY_INT:
@ -496,12 +496,25 @@ static int xkvmgr_add(meta_obj_t* obj, void* key, void* value)
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
int rc;
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
int idx;
if (kvm->dynamic) {
my_rwlock_wlock(&(priv->lock));
}
rc = key_add(kvm->kvtab, key, value);
rc = vstore(kvm->data, value);
if (rc >= 0) {
idx = rc;
rc = key_add(kvm->kvtab, key, (void*)(long)idx);
if (rc >= 0) {
rc = idx;
} else {
vclear(kvm->data, idx);
}
}
if (kvm->dynamic) {
my_rwlock_unlock(&(priv->lock));
@ -515,12 +528,23 @@ static int xkvmgr_find(meta_obj_t* obj, void* key, void** value)
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
int rc;
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
void* data;
*value = NULL;
if (kvm->dynamic) {
my_rwlock_rlock(&(priv->lock));
}
rc = key_find(kvm->kvtab, key, value);
rc = key_find(kvm->kvtab, key, &data);
if (rc >= 0) {
int idx = (int)(long)data;
rc = vget(kvm->data, idx, &data);
if (rc >= 0) {
*value = data;
}
}
if (kvm->dynamic) {
my_rwlock_unlock(&(priv->lock));
@ -587,6 +611,78 @@ static void xkvmgr_iter_destroy(iterator_t* iter)
return;
}
static int xkvmgr_get_vec(meta_obj_t* obj, int count, int* idxs, void** data)
{
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
int rc = 0;
if (kvm->dynamic) {
my_rwlock_rlock(&(priv->lock));
}
rc = vget_vec(kvm->data, count, idxs, data);
if (kvm->dynamic) {
my_rwlock_unlock(&(priv->lock));
}
return rc;
}
static int xkvmgr_get(meta_obj_t* obj, int idx, void** data)
{
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
int rc = 0;
if (kvm->dynamic) {
my_rwlock_rlock(&(priv->lock));
}
rc = vget(kvm->data, idx, data);
if (kvm->dynamic) {
my_rwlock_unlock(&(priv->lock));
}
return rc;
}
static int xkvmgr_put_vec(meta_obj_t* obj, int count, int* idxs, void** data)
{
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
int rc = 0;
if (kvm->dynamic) {
my_rwlock_wlock(&(priv->lock));
}
rc = vput_vec(kvm->data, count, idxs, data);
if (kvm->dynamic) {
my_rwlock_unlock(&(priv->lock));
}
return rc;
}
static int xkvmgr_put(meta_obj_t* obj, int idx, void* data)
{
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
int rc = 0;
if (kvm->dynamic) {
my_rwlock_wlock(&(priv->lock));
}
rc = vput(kvm->data, idx, data);
if (kvm->dynamic) {
my_rwlock_unlock(&(priv->lock));
}
return rc;
}
typeinfo_t xkvmgr_type = {
.name = "xkvmgr",
.privateSize = sizeof(xkvmgr_private_t),
@ -594,9 +690,15 @@ typeinfo_t xkvmgr_type = {
.init = (obj_init_fn_t)xkvmgr_init,
.destroy = (obj_destroy_fn_t)xkvmgr_destroy,
.interfaces
= { .kv = &(intf_kv_t) { .add_key = (key_add_fn_t)xkvmgr_add,
.del_key = (key_del_fn_t)NULL,
.find_key = (key_find_fn_t)xkvmgr_find },
= { .kv = &(intf_kv_t) { .add_key = (key_add_fn_t)xkvmgr_add,
.del_key = (key_del_fn_t)NULL,
.find_key = (key_find_fn_t)xkvmgr_find },
.varray = &(intf_varray_t) { .vstore = (vstore_fn_t)NULL,
.vget = (vget_fn_t)xkvmgr_get,
.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 },
.iter
= &(intf_iterator_t) { .make = (iter_make_fn_t)xkvmgr_make_iter,
.next = (iter_next_fn_t)xkvmgr_iter_next,