changeset 275:ea552c27c7c1

objstore: turn object freeing op from a volume op to an object op Trigger it when the last reference to an object is put. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Mon, 25 Apr 2016 20:00:28 -0400
parents 058ca7d4e96e
children 86f03d554cd3
files src/objstore/include/nomad/objstore_backend.h src/objstore/mem/main.c src/objstore/mem/mem.h src/objstore/mem/obj.c src/objstore/obj.c
diffstat 5 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/objstore/include/nomad/objstore_backend.h	Mon Apr 25 10:21:29 2016 -0400
+++ b/src/objstore/include/nomad/objstore_backend.h	Mon Apr 25 20:00:28 2016 -0400
@@ -104,12 +104,16 @@
 		      const char *name, uint16_t mode, struct noid *child);
 	int (*unlink)(struct objstore_vol *vol, void *dircookie,
 		      const char *name);
+
+	/*
+	 * Called just before the generic object is freed.
+	 */
+	void (*free)(struct obj *obj);
 };
 
 struct vol_ops {
 	int (*getroot)(struct objstore_vol *store, struct noid *root);
 	int (*allocobj)(struct obj *obj);
-	void (*freeobj)(struct obj *obj);
 };
 
 struct objstore_vol_def {
--- a/src/objstore/mem/main.c	Mon Apr 25 10:21:29 2016 -0400
+++ b/src/objstore/mem/main.c	Mon Apr 25 20:00:28 2016 -0400
@@ -70,7 +70,11 @@
 	return 0;
 }
 
-static void mem_freeobj(struct obj *obj)
+/*
+ * We're keeping this here to keep it close to mem_allocobj().  As the name
+ * implies, this is an object op - not a volume op.
+ */
+void mem_obj_free(struct obj *obj)
 {
 	struct memobj *mobj = obj->private;
 
@@ -80,7 +84,6 @@
 static const struct vol_ops vol_ops = {
 	.getroot = mem_vol_getroot,
 	.allocobj = mem_allocobj,
-	.freeobj = mem_freeobj,
 };
 
 static int objcmp(const void *va, const void *vb)
--- a/src/objstore/mem/mem.h	Mon Apr 25 10:21:29 2016 -0400
+++ b/src/objstore/mem/mem.h	Mon Apr 25 20:00:28 2016 -0400
@@ -121,6 +121,8 @@
 
 extern const struct obj_ops obj_ops;
 
+extern void mem_obj_free(struct obj *obj);
+
 extern struct memobj *newmemobj(struct memstore *ms, uint16_t mode);
 extern void freememobj(struct memobj *obj);
 extern struct memobj *findmemobj(struct memstore *store, const struct noid *oid);
--- a/src/objstore/mem/obj.c	Mon Apr 25 10:21:29 2016 -0400
+++ b/src/objstore/mem/obj.c	Mon Apr 25 20:00:28 2016 -0400
@@ -640,4 +640,5 @@
 	.lookup  = mem_obj_lookup,
 	.create  = mem_obj_create,
 	.unlink  = mem_obj_unlink,
+	.free    = mem_obj_free,
 };
--- a/src/objstore/obj.c	Mon Apr 25 10:21:29 2016 -0400
+++ b/src/objstore/obj.c	Mon Apr 25 20:00:28 2016 -0400
@@ -158,6 +158,9 @@
 	if (!obj)
 		return;
 
+	if (obj->ops && obj->ops->free)
+		obj->ops->free(obj);
+
 	mxdestroy(&obj->lock);
 	vol_putref(obj->vol);
 	avl_destroy(&obj->versions);