save works
This commit is contained in:
parent
f4b1ba4cd7
commit
acfbec875b
51 changed files with 622 additions and 1175 deletions
234
src/lib/kvmgr.c
234
src/lib/kvmgr.c
|
|
@ -7,237 +7,12 @@
|
|||
#include "kv.h"
|
||||
#include "kvmgr.h"
|
||||
#include "mylock.h"
|
||||
#include "objmgr.h"
|
||||
#include "utils.h"
|
||||
#include "xce/types.h"
|
||||
#include "zarray.h"
|
||||
|
||||
#include "controller.capnp.h"
|
||||
|
||||
int kvmgr_init(kvmgr_t* mgr, hash_key_fn_t keyfn, int nslots, int delta,
|
||||
zarray_item_killer_t killer)
|
||||
{
|
||||
ht_init(&(mgr->htab), nslots, keyfn);
|
||||
zarray_init(&(mgr->data), delta, killer);
|
||||
mylock_init(&(mgr->lock));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void kvmgr_fini(kvmgr_t* mgr)
|
||||
{
|
||||
ht_fini(&(mgr->htab));
|
||||
zarray_fini(&(mgr->data));
|
||||
mylock_fini(&(mgr->lock));
|
||||
}
|
||||
|
||||
static void* kvmgr_lock_(kvmgr_t* mgr, void* key, int op)
|
||||
{
|
||||
hent_t* e = NULL;
|
||||
int32_t idx;
|
||||
void* ptr;
|
||||
|
||||
e = ht_get(&(mgr->htab), key);
|
||||
if (e == NULL) {
|
||||
SET_ERROR(ENOENT);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
idx = e->data;
|
||||
if (idx < 0) {
|
||||
SET_ERROR(ENOENT);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = (void*)zarray_get(&(mgr->data), idx);
|
||||
if (ptr == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (op == OBJREF_NOP) {
|
||||
return ptr;
|
||||
}
|
||||
|
||||
return obj_ref(ptr, op);
|
||||
}
|
||||
|
||||
void* kvmgr_lock(kvmgr_t* mgr, void* key, int op)
|
||||
{
|
||||
void* ptr = NULL;
|
||||
|
||||
if (mgr == NULL) {
|
||||
SET_ERROR(EINVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((op != OBJREF_NOP) && (op != OBJREF_READ) && (op != OBJREF_UPDATE)) {
|
||||
SET_ERROR(EINVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mylock_lock(&(mgr->lock));
|
||||
ptr = kvmgr_lock_(mgr, key, op);
|
||||
mylock_unlock(&(mgr->lock));
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void* kvmgr_lock_byid(kvmgr_t* mgr, int idx, int op)
|
||||
{
|
||||
void* ptr = NULL;
|
||||
|
||||
if (mgr == NULL) {
|
||||
SET_ERROR(-EINVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((idx < 0) || (idx >= mgr->data.caps)) {
|
||||
SET_ERROR(-EINVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((op != OBJREF_NOP) && (op != OBJREF_READ) && (op != OBJREF_UPDATE)) {
|
||||
SET_ERROR(-EINVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mylock_lock(&(mgr->lock));
|
||||
ptr = (void*)zarray_get(&(mgr->data), idx);
|
||||
mylock_unlock(&(mgr->lock));
|
||||
|
||||
if (ptr == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (op == OBJREF_NOP) {
|
||||
return ptr;
|
||||
}
|
||||
|
||||
return obj_ref(ptr, op);
|
||||
}
|
||||
|
||||
static int32_t kvmgr_add_(kvmgr_t* mgr, void* key, void* p)
|
||||
{
|
||||
hent_t* e = NULL;
|
||||
int idx;
|
||||
|
||||
e = ht_get(&(mgr->htab), key);
|
||||
if (e != NULL) {
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
idx = zarray_store(&(mgr->data), p);
|
||||
if (idx < 0) {
|
||||
return idx;
|
||||
}
|
||||
|
||||
e = ht_add(&(mgr->htab), (void*)key);
|
||||
if (e == NULL) {
|
||||
zarray_del(&(mgr->data), idx);
|
||||
return -errno;
|
||||
}
|
||||
|
||||
e->data = idx;
|
||||
return idx;
|
||||
}
|
||||
|
||||
int32_t kvmgr_add(kvmgr_t* mgr, void* key, void* p)
|
||||
{
|
||||
int32_t idx;
|
||||
|
||||
if ((mgr == NULL) || (p == NULL)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mylock_lock(&(mgr->lock));
|
||||
idx = kvmgr_add_(mgr, key, p);
|
||||
mylock_unlock(&(mgr->lock));
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static int32_t kvmgr_put_(kvmgr_t* mgr, void* key, int idx, void* p)
|
||||
{
|
||||
hent_t* e = NULL;
|
||||
int idx1 = -1;
|
||||
|
||||
e = ht_get(&(mgr->htab), key);
|
||||
if (e != NULL) {
|
||||
idx1 = e->data;
|
||||
if (idx1 >= 0) {
|
||||
zarray_del(&(mgr->data), idx1);
|
||||
}
|
||||
} else {
|
||||
e = ht_add(&(mgr->htab), (void*)key);
|
||||
if (e == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
if (idx1 != idx) {
|
||||
zarray_del(&(mgr->data), idx);
|
||||
}
|
||||
|
||||
e->data = idx;
|
||||
return zarray_put(&(mgr->data), idx, p);
|
||||
}
|
||||
|
||||
int32_t kvmgr_put(kvmgr_t* mgr, void* key, int idx, void* p)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if ((mgr == NULL) || (key == NULL) || (p == NULL) || (idx < 0)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mylock_lock(&(mgr->lock));
|
||||
rc = kvmgr_put_(mgr, key, idx, p);
|
||||
mylock_unlock(&(mgr->lock));
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void kvmgr_del_(kvmgr_t* mgr, void* key)
|
||||
{
|
||||
hent_t* e = NULL;
|
||||
int idx;
|
||||
|
||||
e = ht_get(&(mgr->htab), key);
|
||||
if (e == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
idx = e->data;
|
||||
if (idx < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
zarray_del(&(mgr->data), idx);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void kvmgr_del(kvmgr_t* mgr, void* key)
|
||||
{
|
||||
if (mgr == NULL) {
|
||||
return;
|
||||
}
|
||||
mylock_lock(&(mgr->lock));
|
||||
kvmgr_del_(mgr, key);
|
||||
mylock_unlock(&(mgr->lock));
|
||||
}
|
||||
|
||||
int kvmgr_iter(kvmgr_t* mgr, zarray_iter_skip_fn_t skipfn, xlist_t* l,
|
||||
void* arg)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
mylock_lock(&(mgr->lock));
|
||||
rc = zarray_iter_ex(&(mgr->data), skipfn, l, arg);
|
||||
mylock_unlock(&(mgr->lock));
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
my_rwlock_t lock;
|
||||
} xkvmgr_private_t;
|
||||
|
|
@ -433,6 +208,13 @@ static int xkvmgr_iter_next(iterator_t* iter, void** data)
|
|||
return iter_next(it, data);
|
||||
}
|
||||
|
||||
static int xkvmgr_iter_reset(iterator_t* iter)
|
||||
{
|
||||
iterator_t* it = (iterator_t*)iter->data;
|
||||
|
||||
return iter_reset(it);
|
||||
}
|
||||
|
||||
static void xkvmgr_iter_destroy(iterator_t* iter)
|
||||
{
|
||||
iterator_t* it = iter->data;
|
||||
|
|
@ -546,7 +328,7 @@ typeinfo_t xkvmgr_type = {
|
|||
.iter
|
||||
= &(intf_iterator_t) { .make = (iter_make_fn_t)xkvmgr_make_iter,
|
||||
.next = (iter_next_fn_t)xkvmgr_iter_next,
|
||||
.reset = (iter_reset_fn_t)NULL,
|
||||
.reset = (iter_reset_fn_t)xkvmgr_iter_reset,
|
||||
.destroy
|
||||
= (iter_destroy_fn_t)xkvmgr_iter_destroy } }
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue