Commit 0e7aad85 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Replace the three stevedore methods for iterating over objects

with a single one.
parent c2c164d8
......@@ -858,15 +858,6 @@ void MPL_Free(struct mempool *mpl, void *item);
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);
enum objiter_status {
OIS_DONE,
OIS_DATA,
OIS_STREAM,
OIS_ERROR,
};
void *ObjIterBegin(struct worker *, struct objcore *);
enum objiter_status ObjIter(struct objcore *, void *, void **, ssize_t *);
void ObjIterEnd(struct objcore *, void **);
int ObjGetSpace(struct worker *, struct objcore *, ssize_t *sz, uint8_t **ptr);
void ObjExtend(struct worker *, struct objcore *, ssize_t l);
void ObjTrimStore(struct worker *, struct objcore *);
......
......@@ -84,6 +84,13 @@ obj_getobj(struct worker *wrk, struct objcore *oc)
* is entirely up to the implementation.
*/
enum objiter_status {
OIS_DONE,
OIS_DATA,
OIS_STREAM,
OIS_ERROR,
};
struct objiter {
unsigned magic;
#define OBJITER_MAGIC 0x745fb151
......@@ -97,18 +104,14 @@ struct objiter {
ssize_t checkpoint_len;
};
void *
static void *
ObjIterBegin(struct worker *wrk, struct objcore *oc)
{
struct objiter *oi;
struct object *obj;
const struct storeobj_methods *om = obj_getmethods(oc);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
if (om->objiterbegin != NULL)
return (om->objiterbegin(wrk, oc));
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
obj = obj_getobj(wrk, oc);
CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
......@@ -122,22 +125,18 @@ ObjIterBegin(struct worker *wrk, struct objcore *oc)
return (oi);
}
enum objiter_status
ObjIter(struct objcore *oc, void *oix, void **p, ssize_t *l)
static enum objiter_status
ObjIter(void *oix, void **p, ssize_t *l)
{
struct objiter *oi;
ssize_t ol;
ssize_t nl;
ssize_t sl;
const struct storeobj_methods *om = obj_getmethods(oc);
AN(oix);
AN(p);
AN(l);
if (om->objiter != NULL)
return (om->objiter(oc, oix, p, l));
CAST_OBJ_NOTNULL(oi, oix, OBJITER_MAGIC);
CHECK_OBJ_NOTNULL(oi->obj, OBJECT_MAGIC);
*p = NULL;
......@@ -207,19 +206,13 @@ ObjIter(struct objcore *oc, void *oix, void **p, ssize_t *l)
}
}
void
ObjIterEnd(struct objcore *oc, void **oix)
static void
ObjIterEnd(void **oix)
{
struct objiter *oi;
const struct storeobj_methods *om = obj_getmethods(oc);
AN(oix);
if (om->objiterend != NULL) {
om->objiterend(oc, oix);
return;
}
CAST_OBJ_NOTNULL(oi, (*oix), OBJITER_MAGIC);
*oix = NULL;
CHECK_OBJ_NOTNULL(oi->obj, OBJECT_MAGIC);
......@@ -239,10 +232,14 @@ ObjIterate(struct worker *wrk, struct objcore *oc,
enum objiter_status ois;
void *ptr;
ssize_t len;
const struct storeobj_methods *om = obj_getmethods(oc);
if (om->objiterator != NULL)
return (om->objiterator(wrk, oc, priv, func));
oi = ObjIterBegin(wrk, oc);
do {
ois = ObjIter(oc, oi, &ptr, &len);
ois = ObjIter(oi, &ptr, &len);
switch(ois) {
case OIS_DONE:
AZ(len);
......@@ -261,7 +258,7 @@ ObjIterate(struct worker *wrk, struct objcore *oc,
WRONG("Wrong OIS value");
}
} while (ois == OIS_DATA || ois == OIS_STREAM);
ObjIterEnd(oc, &oi);
ObjIterEnd(&oi);
return (ois == OIS_DONE ? 0 : -1);
}
......
......@@ -79,6 +79,8 @@ struct object {
/* Methods on objcore ------------------------------------------------*/
#ifdef VARNISH_CACHE_CHILD
typedef void updatemeta_f(struct worker *, struct objcore *oc);
typedef void freeobj_f(struct worker *, struct objcore *oc);
typedef struct lru *getlru_f(const struct objcore *oc);
......@@ -93,10 +95,8 @@ typedef struct object *getobj_f(struct worker *, struct objcore *oc);
* Or the can be "complex" and provide all of these methods:
* (Described in comments in cache_obj.c)
*/
typedef void *objiterbegin_f(struct worker *, struct objcore *oc);
typedef enum objiter_status objiter_f(struct objcore *oc, void *oix,
void **p, ssize_t *l);
typedef void objiterend_f(struct objcore *, void **oix);
typedef int objiterator_f(struct worker *, struct objcore *oc,
void *priv, objiterate_f *func);
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);
......@@ -115,9 +115,7 @@ struct storeobj_methods {
getobj_f *getobj;
objiterbegin_f *objiterbegin;
objiter_f *objiter;
objiterend_f *objiterend;
objiterator_f *objiterator;
objgetspace_f *objgetspace;
objextend_f *objextend;
objgetlen_f *objgetlen;
......@@ -127,6 +125,12 @@ struct storeobj_methods {
objsetattr_f *objsetattr;
};
#else
struct storeobj_methods;
#endif
/* Prototypes --------------------------------------------------------*/
typedef void storage_init_f(struct stevedore *, int ac, char * const *av);
......
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