From a34a8b8baee9427ba8bee186e475561e4210ed30 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 23 Oct 2012 05:55:23 -0700 Subject: [PATCH] osdc/ObjectCacher: add ref count to Object Signed-off-by: Sage Weil --- src/osdc/ObjectCacher.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index aeb45c85d3ffe..76a82aba02371 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -155,9 +155,10 @@ class ObjectCacher { }; // ******* Object ********* - class Object { + class Object : public LRUObject { private: // ObjectCacher::Object fields + int ref; ObjectCacher *oc; sobject_t oid; friend class ObjectSet; @@ -199,6 +200,7 @@ class ObjectCacher { const Object& operator=(const Object& other); Object(ObjectCacher *_oc, sobject_t o, ObjectSet *os, object_locator_t& l) : + ref(0), oc(_oc), oid(o), oset(os), set_item(this), oloc(l), last_write_tid(0), last_commit_tid(0), @@ -208,6 +210,7 @@ class ObjectCacher { os->objects.push_back(&set_item); } ~Object() { + assert(ref == 0); assert(data.empty()); assert(dirty_or_tx == 0); set_item.remove_myself(); @@ -273,6 +276,19 @@ class ObjectCacher { void truncate(loff_t s); void discard(loff_t off, loff_t len); + + // reference counting + int get() { + assert(ref >= 0); + if (ref == 0) lru_pin(); + return ++ref; + } + int put() { + assert(ref > 0); + if (ref == 1) lru_unpin(); + --ref; + return ref; + } }; -- 2.39.5