save works
This commit is contained in:
parent
acfbec875b
commit
3f74f14687
38 changed files with 751 additions and 448 deletions
108
src/lib/kvmgr.c
108
src/lib/kvmgr.c
|
|
@ -19,7 +19,6 @@ typedef struct {
|
|||
|
||||
typedef struct {
|
||||
kvmgr_key_type_t key_type;
|
||||
unsigned int dynamic : 1;
|
||||
uint32_t nslots;
|
||||
var kvtab;
|
||||
var data;
|
||||
|
|
@ -34,10 +33,11 @@ static size_t xkvmgr_datasize(va_list ap)
|
|||
|
||||
static int xkvmgr_init(meta_obj_t* obj, va_list ap)
|
||||
{
|
||||
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
|
||||
kvmgr_params_t* params = va_arg(ap, kvmgr_params_t*);
|
||||
kv_params_t kv_params;
|
||||
xzarray_params_t data_params;
|
||||
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
|
||||
kvmgr_params_t* params = va_arg(ap, kvmgr_params_t*);
|
||||
kv_params_t kv_params;
|
||||
xzarray_params_t data_params;
|
||||
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
|
||||
|
||||
if ((params == NULL)
|
||||
|| ((params->key_type != KVMGR_KEY_INT)
|
||||
|
|
@ -76,20 +76,16 @@ static int xkvmgr_init(meta_obj_t* obj, va_list ap)
|
|||
|
||||
kvm->nslots = params->nslots;
|
||||
kvm->key_type = params->key_type;
|
||||
kvm->dynamic = params->dynamic;
|
||||
|
||||
if (params->dynamic) {
|
||||
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
|
||||
|
||||
my_rwlock_init(&(priv->lock));
|
||||
}
|
||||
my_rwlock_init(&(priv->lock));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void xkvmgr_destroy(meta_obj_t* obj)
|
||||
{
|
||||
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
|
||||
xkvmgr_t* kvm = RTTI_OBJ_TO_DATA(xkvmgr_t, obj);
|
||||
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
|
||||
|
||||
if (kvm->data != NULL) {
|
||||
destroy(kvm->data);
|
||||
|
|
@ -99,11 +95,7 @@ static void xkvmgr_destroy(meta_obj_t* obj)
|
|||
destroy(kvm->kvtab);
|
||||
}
|
||||
|
||||
if (kvm->dynamic) {
|
||||
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
|
||||
|
||||
my_rwlock_fini(&(priv->lock));
|
||||
}
|
||||
my_rwlock_fini(&(priv->lock));
|
||||
memset(kvm, 0x0, sizeof(*kvm));
|
||||
|
||||
return;
|
||||
|
|
@ -116,10 +108,6 @@ static int xkvmgr_add(meta_obj_t* obj, void* key, void* value)
|
|||
xkvmgr_private_t* priv = RTTI_OBJ_TO_PRIV(obj);
|
||||
int idx;
|
||||
|
||||
if (kvm->dynamic) {
|
||||
my_rwlock_wlock(&(priv->lock));
|
||||
}
|
||||
|
||||
rc = vstore(kvm->data, value);
|
||||
|
||||
if (rc >= 0) {
|
||||
|
|
@ -134,10 +122,6 @@ static int xkvmgr_add(meta_obj_t* obj, void* key, void* value)
|
|||
}
|
||||
}
|
||||
|
||||
if (kvm->dynamic) {
|
||||
my_rwlock_unlock(&(priv->lock));
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -150,10 +134,6 @@ static int xkvmgr_find(meta_obj_t* obj, void* key, void** value)
|
|||
|
||||
*value = NULL;
|
||||
|
||||
if (kvm->dynamic) {
|
||||
my_rwlock_rlock(&(priv->lock));
|
||||
}
|
||||
|
||||
rc = key_find(kvm->kvtab, key, &data);
|
||||
if (rc >= 0) {
|
||||
int idx = (int)(long)data;
|
||||
|
|
@ -165,10 +145,6 @@ static int xkvmgr_find(meta_obj_t* obj, void* key, void** value)
|
|||
}
|
||||
}
|
||||
|
||||
if (kvm->dynamic) {
|
||||
my_rwlock_unlock(&(priv->lock));
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -184,15 +160,9 @@ static int xkvmgr_make_iter(iterator_t* iter, va_list ap)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (kvm->dynamic) {
|
||||
my_rwlock_rlock(&(priv->lock));
|
||||
}
|
||||
rc = iter_make(it, kvm->data);
|
||||
if (rc < 0) {
|
||||
FREEUP(it);
|
||||
if (kvm->dynamic) {
|
||||
my_rwlock_unlock(&(priv->lock));
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -230,10 +200,6 @@ static void xkvmgr_iter_destroy(iterator_t* iter)
|
|||
|
||||
iter->data = NULL;
|
||||
|
||||
if (kvm->dynamic) {
|
||||
my_rwlock_unlock(&(priv->lock));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -243,15 +209,8 @@ static int xkvmgr_get_vec(meta_obj_t* obj, int count, int* idxs, void** data)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
@ -261,15 +220,8 @@ static int xkvmgr_get(meta_obj_t* obj, int idx, void** data)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
@ -279,15 +231,8 @@ static int xkvmgr_put_vec(meta_obj_t* obj, int count, int* idxs, void** data)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
@ -297,18 +242,39 @@ static int xkvmgr_put(meta_obj_t* obj, int idx, void* data)
|
|||
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;
|
||||
}
|
||||
|
||||
static int xkvmgr_lock(meta_obj_t* obj, uint64_t option)
|
||||
{
|
||||
xkvmgr_private_t* priv = (xkvmgr_private_t*)RTTI_OBJ_TO_PRIV(obj);
|
||||
int rc = -EINVAL;
|
||||
|
||||
switch (option) {
|
||||
case RTTI_LOCK_READ:
|
||||
rc = my_rwlock_rlock(&(priv->lock));
|
||||
break;
|
||||
case RTTI_LOCK_WRITE:
|
||||
rc = my_rwlock_wlock(&(priv->lock));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void xkvmgr_unlock(meta_obj_t* obj)
|
||||
{
|
||||
xkvmgr_private_t* priv = (xkvmgr_private_t*)RTTI_OBJ_TO_PRIV(obj);
|
||||
|
||||
my_rwlock_unlock(&(priv->lock));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
typeinfo_t xkvmgr_type = {
|
||||
.name = "xkvmgr",
|
||||
.privateSize = sizeof(xkvmgr_private_t),
|
||||
|
|
@ -330,5 +296,7 @@ typeinfo_t xkvmgr_type = {
|
|||
.next = (iter_next_fn_t)xkvmgr_iter_next,
|
||||
.reset = (iter_reset_fn_t)xkvmgr_iter_reset,
|
||||
.destroy
|
||||
= (iter_destroy_fn_t)xkvmgr_iter_destroy } }
|
||||
= (iter_destroy_fn_t)xkvmgr_iter_destroy },
|
||||
.lock = &(intf_lock_t) { .lock = (lock_fn_t)xkvmgr_lock,
|
||||
.unlock = (unlock_fn_t)xkvmgr_unlock } }
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue