From e8bf383d5301c1a298aab27d2a70b94991fa6dfc Mon Sep 17 00:00:00 2001 From: Coldwings Date: Tue, 9 Jul 2024 16:06:25 +0800 Subject: [PATCH] Make borrow/update always get new created object Signed-off-by: Coldwings --- common/objectcachev2.h | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/common/objectcachev2.h b/common/objectcachev2.h index 96b606cc..125e3228 100644 --- a/common/objectcachev2.h +++ b/common/objectcachev2.h @@ -48,13 +48,12 @@ class ObjectCacheV2 { // Returned RefPtr is the old one // other reader will get new one after updated - std::shared_ptr update(V* val, uint64_t ts = 0) { - while (box->reflock.try_lock() != 0) { - photon::thread_yield(); - } - DEFER(box->reflock.unlock()); + std::shared_ptr update(V* val, uint64_t ts = 0, + std::shared_ptr* newptr = nullptr) { + SCOPED_LOCK(box->reflock); auto r = std::shared_ptr(val); - if (ts) box->lastcreate = ts; + if (newptr) *newptr = r; + box->lastcreate = ts; std::swap(r, box->ref); return r; } @@ -103,9 +102,11 @@ class ObjectCacheV2 { uint64_t lifespan; photon::Timer _timer; - void __update(Box* item, V* val) { - reclaim_queue.template send( - new std::shared_ptr(item->writer().update(val, photon::now))); + std::shared_ptr __update(Box* item, V* val) { + std::shared_ptr ret; + reclaim_queue.template send(new std::shared_ptr( + item->writer().update(val, photon::now, &ret))); + return ret; } template @@ -199,19 +200,19 @@ class ObjectCacheV2 { while (!r) { if (item->boxlock.try_lock() == 0) { DEFER(item->boxlock.unlock()); - auto lr = item->reader(); - if (!lr) { + r = item->reader(); + if (!r) { if (photon::sat_add(item->lastcreate, cooldown) <= photon::now) { - __update(item, ctor()); + r = __update(item, ctor()); } - return Borrow(this, item, item->reader()); + return Borrow(this, item, std::move(r)); } } photon::thread_yield(); r = item->reader(); } - return Borrow(this, item, item->reader()); + return Borrow(this, item, std::move(r)); } template @@ -222,8 +223,8 @@ class ObjectCacheV2 { template Borrow update(KeyType&& key, Ctor&& ctor) { auto item = __find_or_create_item(std::forward(key)); - __update(item, ctor()); - return Borrow(this, item, item->reader()); + auto r = __update(item, ctor()); + return Borrow(this, item, std::move(r)); } ObjectCacheV2(uint64_t lifespan)