[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