[master] 0e7aad8 Replace the three stevedore methods for iterating over objects with a single one.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Dec 10 01:23:28 CET 2015
commit 0e7aad850a3cb2344140f3d0d5530f1969a5664f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Dec 9 23:11:35 2015 +0000
Replace the three stevedore methods for iterating over objects
with a single one.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index eb892ae..10019bf 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -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 *);
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index 2203845..f7c0712 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -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);
}
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index 5c5bdfb..f6636ee 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -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);
More information about the varnish-commit
mailing list