]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/asio/detail/posix_event.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / asio / detail / posix_event.hpp
index 970f2986380551c7e56bdc7b1e122508748c41c3..10c920dbf3c7813829e68b60fa23a20dd25ace34 100644 (file)
@@ -2,7 +2,7 @@
 // detail/posix_event.hpp
 // ~~~~~~~~~~~~~~~~~~~~~~
 //
-// Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 //
 // Distributed under the Boost Software License, Version 1.0. (See accompanying
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -19,6 +19,7 @@
 
 #if defined(BOOST_ASIO_HAS_PTHREADS)
 
+#include <cstddef>
 #include <pthread.h>
 #include <boost/asio/detail/assert.hpp>
 #include <boost/asio/detail/noncopyable.hpp>
@@ -71,6 +72,18 @@ public:
       ::pthread_cond_signal(&cond_); // Ignore EINVAL.
   }
 
+  // Unlock the mutex and signal one waiter who may destroy us.
+  template <typename Lock>
+  void unlock_and_signal_one_for_destruction(Lock& lock)
+  {
+    BOOST_ASIO_ASSERT(lock.locked());
+    state_ |= 1;
+    bool have_waiters = (state_ > 1);
+    if (have_waiters)
+      ::pthread_cond_signal(&cond_); // Ignore EINVAL.
+    lock.unlock();
+  }
+
   // If there's a waiter, unlock the mutex and signal it.
   template <typename Lock>
   bool maybe_unlock_and_signal_one(Lock& lock)
@@ -118,24 +131,27 @@ public:
       state_ += 2;
       timespec ts;
 #if (defined(__MACH__) && defined(__APPLE__)) \
-      || (defined(__ANDROID__) && (__ANDROID_API__ < 21))
+      || (defined(__ANDROID__) && (__ANDROID_API__ < 21) \
+          && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE))
       ts.tv_sec = usec / 1000000;
       ts.tv_nsec = (usec % 1000000) * 1000;
       ::pthread_cond_timedwait_relative_np(
           &cond_, &lock.mutex().mutex_, &ts); // Ignore EINVAL.
 #else // (defined(__MACH__) && defined(__APPLE__))
-      // || (defined(__ANDROID__) && (__ANDROID_API__ < 21))
+      // || (defined(__ANDROID__) && (__ANDROID_API__ < 21)
+      //     && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE))
       if (::clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
       {
         ts.tv_sec += usec / 1000000;
-        ts.tv_nsec = (usec % 1000000) * 1000;
+        ts.tv_nsec += (usec % 1000000) * 1000;
         ts.tv_sec += ts.tv_nsec / 1000000000;
         ts.tv_nsec = ts.tv_nsec % 1000000000;
         ::pthread_cond_timedwait(&cond_,
             &lock.mutex().mutex_, &ts); // Ignore EINVAL.
       }
 #endif // (defined(__MACH__) && defined(__APPLE__))
-       // || (defined(__ANDROID__) && (__ANDROID_API__ < 21))
+       // || (defined(__ANDROID__) && (__ANDROID_API__ < 21)
+       //     && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE))
       state_ -= 2;
     }
     return (state_ & 1) != 0;