]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: use C_SaferCond for "Client::_read"
authordongdong tao <tdd21151186@gmail.com>
Sun, 7 Jan 2018 13:07:11 +0000 (21:07 +0800)
committerdongdong tao <tdd21151186@gmail.com>
Sat, 13 Jan 2018 09:38:38 +0000 (17:38 +0800)
Signed-off-by: dongdong tao <tdd21151186@gmail.com>
src/client/Client.cc

index 1c2d66002eab9cae54558fdf7aaff549c9239576..83b53d99fa7fb5db2dab9f2e496f80fd082fdcde 100644 (file)
@@ -8762,19 +8762,12 @@ retry:
   if (f->flags & O_DIRECT)
     have &= ~CEPH_CAP_FILE_CACHE;
 
-  Mutex uninline_flock("Client::_read_uninline_data flock");
-  Cond uninline_cond;
-  bool uninline_done = false;
-  int uninline_ret = 0;
-  Context *onuninline = NULL;
+  std::unique_ptr<C_SaferCond> onuninline = nullptr;
 
   if (in->inline_version < CEPH_INLINE_NONE) {
     if (!(have & CEPH_CAP_FILE_CACHE)) {
-      onuninline = new C_SafeCond(&uninline_flock,
-                                  &uninline_cond,
-                                  &uninline_done,
-                                  &uninline_ret);
-      uninline_data(in, onuninline);
+      onuninline.reset(new C_SaferCond("Client::_read_uninline_data flock"));
+      uninline_data(in, onuninline.get());
     } else {
       uint32_t len = in->inline_data.length();
 
@@ -8841,21 +8834,17 @@ success:
 done:
   // done!
 
-  if (onuninline) {
+  if (nullptr != onuninline) {
     client_lock.Unlock();
-    uninline_flock.Lock();
-    while (!uninline_done)
-      uninline_cond.Wait(uninline_flock);
-    uninline_flock.Unlock();
+    int ret = onuninline->wait();
     client_lock.Lock();
-
-    if (uninline_ret >= 0 || uninline_ret == -ECANCELED) {
+    if (ret >= 0 || ret == -ECANCELED) {
       in->inline_data.clear();
       in->inline_version = CEPH_INLINE_NONE;
       mark_caps_dirty(in, CEPH_CAP_FILE_WR);
       check_caps(in, 0);
     } else
-      r = uninline_ret;
+      r = ret;
   }
 
   if (have)