[master] 666ede5 Methodify the rest of the Obj* functions.

Poul-Henning Kamp phk at FreeBSD.org
Mon Sep 15 23:12:37 CEST 2014


commit 666ede56d8a218b3cc1b5c75f656360c6b374467
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Sep 15 21:12:20 2014 +0000

    Methodify the rest of the Obj* functions.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 62e3485..f1da513 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -402,18 +402,6 @@ struct storeobj {
  * housekeeping fields parts of an object.
  */
 
-enum obj_attr {
-#define OBJ_ATTR(U, l)	OA_##U,
-#include "tbl/obj_attr.h"
-#undef OBJ_ATTR
-};
-
-enum obj_flags {
-#define OBJ_FLAG(U, l, v)	OF_##U = v,
-#include "tbl/obj_attr.h"
-#undef OBJ_FLAG
-};
-
 struct objcore {
 	unsigned		magic;
 #define OBJCORE_MAGIC		0x4d301302
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index 60b38df..53b686f 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -325,7 +325,32 @@ ObjExtend(struct objcore *oc, struct dstat *ds, ssize_t l)
 	o->len += l;
 }
 
-/*--------------------------------------------------------------------
+/*====================================================================
+ * ObjGetlen()
+ *
+ * This is a separate function because it may need locking
+ */
+
+uint64_t
+ObjGetLen(struct objcore *oc, struct dstat *ds)
+{
+	struct object *o;
+	const struct storeobj_methods *om = obj_getmethods(oc);
+
+	if (om->objgetlen != NULL)
+		return (om->objgetlen(oc, ds));
+
+	o = obj_getobj(oc, ds);
+	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
+	return (o->len);
+}
+
+
+/*====================================================================
+ * ObjTrimStore()
+ *
+ * Release any surplus space allocated, we promise not to call ObjExtend()
+ * any more.
  */
 
 void
@@ -334,6 +359,12 @@ ObjTrimStore(struct objcore *oc, struct dstat *ds)
 	const struct stevedore *stv;
 	struct storage *st;
 	struct object *o;
+	const struct storeobj_methods *om = obj_getmethods(oc);
+
+	if (om->objtrimstore != NULL) {
+		om->objtrimstore(oc, ds);
+		return;
+	}
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(ds);
@@ -352,8 +383,11 @@ ObjTrimStore(struct objcore *oc, struct dstat *ds)
 	}
 }
 
-/*--------------------------------------------------------------------
- * Early disposal of storage from soon to be killed object.
+/*====================================================================
+ * ObjSlim()
+ *
+ * Free the whatever storage can be freed, without freeing the actual
+ * object yet.
  */
 
 void
@@ -361,6 +395,12 @@ ObjSlim(struct objcore *oc, struct dstat *ds)
 {
 	struct object *o;
 	struct storage *st, *stn;
+	const struct storeobj_methods *om = obj_getmethods(oc);
+
+	if (om->objslim != NULL) {
+		om->objslim(oc, ds);
+		return;
+	}
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(ds);
@@ -378,6 +418,8 @@ ObjSlim(struct objcore *oc, struct dstat *ds)
 	}
 }
 
+/*====================================================================
+ */
 void
 ObjUpdateMeta(struct objcore *oc, struct dstat *ds)
 {
@@ -387,6 +429,8 @@ ObjUpdateMeta(struct objcore *oc, struct dstat *ds)
 		m->updatemeta(oc, ds);
 }
 
+/*====================================================================
+ */
 void
 ObjFreeObj(struct objcore *oc, struct dstat *ds)
 {
@@ -398,6 +442,8 @@ ObjFreeObj(struct objcore *oc, struct dstat *ds)
 	m->freeobj(oc, ds);
 }
 
+/*====================================================================
+ */
 struct lru *
 ObjGetLRU(const struct objcore *oc)
 {
@@ -408,12 +454,22 @@ ObjGetLRU(const struct objcore *oc)
 	return (m->getlru(oc));
 }
 
+/*====================================================================
+ * ObjGetattr()
+ *
+ * Get an attribute of the object.
+ */
+
 void *
 ObjGetattr(struct objcore *oc, struct dstat *ds, enum obj_attr attr,
    ssize_t *len)
 {
 	struct object *o;
 	ssize_t dummy;
+	const struct storeobj_methods *om = obj_getmethods(oc);
+
+	if (om->objgetattr != NULL)
+		return (om->objgetattr(oc, ds, attr, len));
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(ds);
@@ -451,6 +507,13 @@ ObjGetattr(struct objcore *oc, struct dstat *ds, enum obj_attr attr,
 	WRONG("Unsupported OBJ_ATTR");
 }
 
+/*====================================================================
+ * ObjSetattr()
+ *
+ * If ptr is Non-NULL, it points to the new content which is copied into
+ * the attribute.  Otherwise the caller will have to do the copying.
+ */
+
 void *
 ObjSetattr(const struct vfp_ctx *vc, enum obj_attr attr, ssize_t len,
     const void *ptr)
@@ -458,6 +521,10 @@ ObjSetattr(const struct vfp_ctx *vc, enum obj_attr attr, ssize_t len,
 	struct object *o;
 	void *retval = NULL;
 	struct storage *st;
+	const struct storeobj_methods *om = obj_getmethods(vc->oc);
+
+	if (om->objsetattr != NULL)
+		return (om->objsetattr(vc, attr, len, ptr));
 
 	CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(vc->bo, BUSYOBJ_MAGIC);
@@ -513,6 +580,10 @@ ObjSetattr(const struct vfp_ctx *vc, enum obj_attr attr, ssize_t len,
 	return (retval);
 }
 
+/*====================================================================
+ * Utility functions which work on top of the previous ones
+ */
+
 int
 ObjCopyAttr(const struct vfp_ctx *vc, struct objcore *ocs, enum obj_attr attr)
 {
@@ -540,16 +611,6 @@ ObjGetXID(struct objcore *oc, struct dstat *ds)
 	return (u);
 }
 
-uint64_t
-ObjGetLen(struct objcore *oc, struct dstat *ds)
-{
-	struct object *o;
-
-	o = obj_getobj(oc, ds);
-	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
-	return (o->len);
-}
-
 /*--------------------------------------------------------------------
  * There is no well-defined byteorder for IEEE-754 double and the
  * correct solution (frexp(3) and manual encoding) is more work
diff --git a/bin/varnishd/common/common.h b/bin/varnishd/common/common.h
index 7c98526..17b68b1 100644
--- a/bin/varnishd/common/common.h
+++ b/bin/varnishd/common/common.h
@@ -51,6 +51,18 @@ enum baninfo {
 	BI_DROP
 };
 
+enum obj_attr {
+#define OBJ_ATTR(U, l)	OA_##U,
+#include "tbl/obj_attr.h"
+#undef OBJ_ATTR
+};
+
+enum obj_flags {
+#define OBJ_FLAG(U, l, v)	OF_##U = v,
+#include "tbl/obj_attr.h"
+#undef OBJ_FLAG
+};
+
 struct cli;
 
 /**********************************************************************
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index a5376a9..9ddd770 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -31,7 +31,6 @@
  *
  */
 
-struct stv_objsecrets;
 struct stevedore;
 struct sess;
 struct dstat;
@@ -40,6 +39,7 @@ struct objcore;
 struct worker;
 struct lru;
 struct vsl_log;
+struct vfp_ctx;
 
 /* Storage -----------------------------------------------------------*/
 
@@ -102,13 +102,13 @@ typedef void objiterend_f(struct objcore *oc, void **oix);
 typedef int objgetspace_f(struct objcore *oc, struct vsl_log *vsl,
     struct dstat *ds, ssize_t *sz, uint8_t **ptr);
 typedef void objextend_f(struct objcore *oc, struct dstat *ds, ssize_t l);
-
-/* objtrimstore */
-/* objslim */
-/* objgetattr */
-/* objsetattr */
-/* objextend */
-/* objgetlen */
+typedef void objtrimstore_f(struct objcore *oc, struct dstat *ds);
+typedef void objslim_f(struct objcore *oc, struct dstat *ds);
+typedef void *objgetattr_f(struct objcore *oc, struct dstat *ds,
+    enum obj_attr attr, ssize_t *len);
+typedef void *objsetattr_f(const struct vfp_ctx *vc, enum obj_attr attr,
+    ssize_t len, const void *ptr);
+typedef uint64_t objgetlen_f(struct objcore *oc, struct dstat *ds);
 
 struct storeobj_methods {
 	freeobj_f	*freeobj;
@@ -122,6 +122,11 @@ struct storeobj_methods {
 	objiterend_f	*objiterend;
 	objgetspace_f	*objgetspace;
 	objextend_f	*objextend;
+	objgetlen_f	*objgetlen;
+	objtrimstore_f	*objtrimstore;
+	objslim_f	*objslim;
+	objgetattr_f	*objgetattr;
+	objsetattr_f	*objsetattr;
 };
 
 /* Prototypes --------------------------------------------------------*/



More information about the varnish-commit mailing list