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