Commit 44108468 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Centralize objcore and boc create/destroy.

Rename ObjStable() to ObjBocDone() which is more precise.
parent 29313f17
......@@ -859,6 +859,7 @@ void MPL_Free(struct mempool *mpl, void *item);
/* cache_obj.c */
struct objcore * ObjNew(struct worker *);
void ObjDestroy(struct worker *, struct objcore **);
typedef int objiterate_f(void *priv, int flush, const void *ptr, ssize_t len);
int ObjIterate(struct worker *, struct objcore *,
void *priv, objiterate_f *func);
......@@ -882,7 +883,7 @@ void *ObjSetAttr(struct worker *, struct objcore *, enum obj_attr,
ssize_t len, const void *);
int ObjCopyAttr(struct worker *, struct objcore *, struct objcore *,
enum obj_attr attr);
void ObjStable(struct worker *, struct objcore *, struct boc *);
void ObjBocDone(struct worker *, struct objcore *, struct boc **);
int ObjSetDouble(struct worker *, struct objcore *, enum obj_attr, double);
int ObjSetU32(struct worker *, struct objcore *, enum obj_attr, uint32_t);
......
......@@ -91,10 +91,8 @@ hsh_prealloc(struct worker *wrk)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
if (wrk->nobjcore == NULL) {
if (wrk->nobjcore == NULL)
wrk->nobjcore = ObjNew(wrk);
wrk->nobjcore->flags |= OC_F_BUSY;
}
CHECK_OBJ_NOTNULL(wrk->nobjcore, OBJCORE_MAGIC);
if (wrk->nobjhead == NULL) {
......@@ -120,7 +118,7 @@ HSH_Private(struct worker *wrk)
AN(oc);
oc->refcnt = 1;
oc->objhead = private_oh;
oc->flags |= OC_F_PRIVATE | OC_F_BUSY;
oc->flags |= OC_F_PRIVATE;
Lck_Lock(&private_oh->mtx);
VTAILQ_INSERT_TAIL(&private_oh->objcs, oc, hsh_list);
private_oh->refcnt++;
......@@ -133,11 +131,9 @@ void
HSH_Cleanup(struct worker *wrk)
{
if (wrk->nobjcore != NULL) {
FREE_OBJ(wrk->nobjcore);
wrk->stats->n_objectcore--;
wrk->nobjcore = NULL;
}
if (wrk->nobjcore != NULL)
ObjDestroy(wrk, &wrk->nobjcore);
if (wrk->nobjhead != NULL) {
Lck_Delete(&wrk->nobjhead->mtx);
FREE_OBJ(wrk->nobjhead);
......@@ -798,14 +794,8 @@ HSH_DerefBoc(struct worker *wrk, struct objcore *oc)
if (r == 0)
oc->boc = NULL;
Lck_Unlock(&oc->objhead->mtx);
if (r == 0) {
if (oc->stobj->stevedore != NULL)
ObjStable(wrk, oc, boc);
AZ(pthread_cond_destroy(&boc->cond));
Lck_Delete(&boc->mtx);
free(boc->vary);
FREE_OBJ(boc);
}
if (r == 0)
ObjBocDone(wrk, oc, &boc);
}
/*--------------------------------------------------------------------
......@@ -850,9 +840,8 @@ HSH_DerefObjCore(struct worker *wrk, struct objcore **ocp)
if (oc->stobj->stevedore != NULL)
ObjFreeObj(wrk, oc);
FREE_OBJ(oc);
ObjDestroy(wrk, &oc);
wrk->stats->n_objectcore--;
/* Drop our ref on the objhead */
assert(oh->refcnt > 0);
(void)HSH_DerefObjHead(wrk, &oh);
......
......@@ -54,7 +54,7 @@
* 2 ObjSetU32()
* 2 ObjSetU64()
*
* 2->3 ObjStable() Will no longer be modified (clean up boc)
* 2->3 ObjBocDone() Boc removed from OC, clean it up
*
* 23 ObjHasAttr()
* 23 ObjGetAttr()
......@@ -99,6 +99,34 @@ obj_getmethods(const struct objcore *oc)
return (oc->stobj->stevedore->methods);
}
static struct boc *
obj_newboc(void)
{
struct boc *boc;
ALLOC_OBJ(boc, BOC_MAGIC);
AN(boc);
Lck_New(&boc->mtx, lck_busyobj);
AZ(pthread_cond_init(&boc->cond, NULL));
boc->refcount = 1;
return (boc);
}
static void
obj_deleteboc(struct boc **p)
{
struct boc *boc;
AN(p);
boc = *p;
*p = NULL;
Lck_Delete(&boc->mtx);
AZ(pthread_cond_destroy(&boc->cond));
if (boc->vary != NULL)
free(boc->vary);
FREE_OBJ(boc);
}
/*====================================================================
* ObjNew()
*
......@@ -115,14 +143,34 @@ ObjNew(struct worker *wrk)
AN(oc);
wrk->stats->n_objectcore++;
oc->last_lru = NAN;
ALLOC_OBJ(oc->boc, BOC_MAGIC);
AN(oc->boc);
Lck_New(&oc->boc->mtx, lck_busyobj);
AZ(pthread_cond_init(&oc->boc->cond, NULL));
oc->boc->refcount = 1;
oc->flags = OC_F_BUSY;
oc->boc = obj_newboc();
return (oc);
}
/*====================================================================
* ObjDestroy()
*
*/
void
ObjDestroy(struct worker *wrk, struct objcore **p)
{
struct objcore *oc;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
AN(p);
oc = *p;
*p = NULL;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
if (oc->boc != NULL)
obj_deleteboc(&oc->boc);
FREE_OBJ(oc);
wrk->stats->n_objectcore--;
}
/*====================================================================
* ObjIterate()
*
......@@ -322,14 +370,19 @@ ObjSlim(struct worker *wrk, struct objcore *oc)
*/
void
ObjStable(struct worker *wrk, struct objcore *oc, struct boc *boc)
ObjBocDone(struct worker *wrk, struct objcore *oc, struct boc **boc)
{
const struct obj_methods *m = obj_getmethods(oc);
const struct obj_methods *m;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
if (m->objstable != NULL)
m->objstable(wrk, oc, boc);
AN(boc);
CHECK_OBJ_NOTNULL(*boc, BOC_MAGIC);
if (oc->stobj->stevedore != NULL) {
m = obj_getmethods(oc);
if (m->objbocdone != NULL)
m->objbocdone(wrk, oc, *boc);
}
obj_deleteboc(boc);
}
/*====================================================================
......
......@@ -41,7 +41,7 @@ typedef int objgetspace_f(struct worker *, struct objcore *,
ssize_t *sz, uint8_t **ptr);
typedef void objextend_f(struct worker *, struct objcore *, ssize_t l);
typedef void objtrimstore_f(struct worker *, struct objcore *);
typedef void objstable_f(struct worker *, struct objcore *, struct boc *);
typedef void objbocdone_f(struct worker *, struct objcore *, struct boc *);
typedef void objslim_f(struct worker *, struct objcore *);
typedef const void *objgetattr_f(struct worker *, struct objcore *,
enum obj_attr attr, ssize_t *len);
......@@ -55,7 +55,7 @@ struct obj_methods {
objgetspace_f *objgetspace;
objextend_f *objextend;
objtrimstore_f *objtrimstore;
objstable_f *objstable;
objbocdone_f *objbocdone;
objslim_f *objslim;
objgetattr_f *objgetattr;
objsetattr_f *objsetattr;
......
......@@ -451,13 +451,13 @@ sml_trimstore(struct worker *wrk, struct objcore *oc)
VTAILQ_REMOVE(&o->list, st, list);
VTAILQ_INSERT_TAIL(&o->list, st1, list);
Lck_Unlock(&oc->boc->mtx);
/* sml_stable frees this */
/* sml_bocdone frees this */
AZ(oc->boc->stevedore_priv);
oc->boc->stevedore_priv = st;
}
static void __match_proto__(objstable_f)
sml_stable(struct worker *wrk, struct objcore *oc, struct boc *boc)
static void __match_proto__(objbocdone_f)
sml_bocdone(struct worker *wrk, struct objcore *oc, struct boc *boc)
{
const struct stevedore *stv;
struct storage *st;
......@@ -610,7 +610,7 @@ const struct obj_methods SML_methods = {
.objgetspace = sml_getspace,
.objextend = sml_extend,
.objtrimstore = sml_trimstore,
.objstable = sml_stable,
.objbocdone = sml_bocdone,
.objslim = sml_slim,
.objgetattr = sml_getattr,
.objsetattr = sml_setattr,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment