]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: add _with_lock method to obc 38378/head
authorXuehan Xu <xxhdx1985126@gmail.com>
Wed, 2 Dec 2020 02:30:07 +0000 (10:30 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Wed, 2 Dec 2020 02:34:48 +0000 (10:34 +0800)
this is modeling the seastar::with_lock() method with the exception
that obc is also captured in the finally block.

Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/osd/object_context.h

index 7e14ac3e16f0c7a9df63dada819b10120589ec0c..335d26a21e98fc9460a3424fbdbf16bc9a161691 100644 (file)
@@ -111,18 +111,28 @@ private:
       make_blocking_future(std::forward<LockF>(lockf)));
   }
 
+  template <typename Lock, typename Func>
+  auto _with_lock(Lock&& lock, Func&& func) {
+    Ref obc = this;
+    return lock.lock().then([&lock, func = std::forward<Func>(func), obc]() mutable {
+      return seastar::futurize_invoke(func).finally([&lock, obc] {
+       lock.unlock();
+      });
+    });
+  }
+
 public:
   template<RWState::State Type, typename Func>
   auto with_lock(Func&& func) {
     switch (Type) {
     case RWState::RWWRITE:
-      return seastar::with_lock(lock.for_write(), std::forward<Func>(func));
+      return _with_lock(lock.for_write(), std::forward<Func>(func));
     case RWState::RWREAD:
-      return seastar::with_lock(lock.for_read(), std::forward<Func>(func));
+      return _with_lock(lock.for_read(), std::forward<Func>(func));
     case RWState::RWEXCL:
-      return seastar::with_lock(lock.for_excl(), std::forward<Func>(func));
+      return _with_lock(lock.for_excl(), std::forward<Func>(func));
     case RWState::RWNONE:
-      return seastar::futurize_invoke(func);
+      return seastar::futurize_invoke(std::forward<Func>(func));
     default:
       assert(0 == "noop");
     }
@@ -131,11 +141,11 @@ public:
   auto with_promoted_lock(Func&& func) {
     switch (Type) {
     case RWState::RWWRITE:
-      return seastar::with_lock(lock.excl_from_write(), std::forward<Func>(func));
+      return _with_lock(lock.excl_from_write(), std::forward<Func>(func));
     case RWState::RWREAD:
-      return seastar::with_lock(lock.excl_from_read(), std::forward<Func>(func));
+      return _with_lock(lock.excl_from_read(), std::forward<Func>(func));
     case RWState::RWEXCL:
-      return seastar::with_lock(lock.excl_from_excl(), std::forward<Func>(func));
+      return _with_lock(lock.excl_from_excl(), std::forward<Func>(func));
      default:
       assert(0 == "noop");
     }