update LockTraitsBoost to handle arbitrary duration types
authorAdam Simpkins <simpkins@fb.com>
Fri, 8 Jul 2016 18:42:35 +0000 (11:42 -0700)
committerFacebook Github Bot 7 <facebook-github-bot-7-bot@fb.com>
Fri, 8 Jul 2016 18:54:21 +0000 (11:54 -0700)
Summary:
Update the boost LockTraits classes to accept arbitrary std::chrono::duration
types, rather than just std::chrono::milliseconds.

Reviewed By: yfeldblum

Differential Revision: D3533556

fbshipit-source-id: e764cdf4dafa0b11cd7558c2d5bfb6f80dce88cf

folly/LockTraitsBoost.h

index dd9a17b6b74e69194a1992990b24eccdef2aeb6f..914efd58e6598f64c61a458bc06f777e0abc9641 100644 (file)
 
 namespace folly {
 
 
 namespace folly {
 
+namespace detail {
+/// Convert a std::chrono::duration argument to boost::chrono::duration
+template <class Rep, std::intmax_t Num, std::intmax_t Denom>
+boost::chrono::duration<Rep, boost::ratio<Num, Denom>> toBoostDuration(
+    const std::chrono::duration<Rep, std::ratio<Num, Denom>>& d) {
+  return boost::chrono::duration<Rep, boost::ratio<Num, Denom>>(d.count());
+}
+}
+
 /**
  * LockTraits specialization for boost::shared_mutex
  */
 /**
  * LockTraits specialization for boost::shared_mutex
  */
@@ -39,19 +48,18 @@ struct LockTraits<boost::shared_mutex>
   static constexpr bool is_shared = true;
   static constexpr bool is_timed = true;
 
   static constexpr bool is_shared = true;
   static constexpr bool is_timed = true;
 
+  template <class Rep, class Period>
   static bool try_lock_for(
       boost::shared_mutex& mutex,
   static bool try_lock_for(
       boost::shared_mutex& mutex,
-      std::chrono::milliseconds timeout) {
-    // Convert the std::chrono argument to boost::chrono
-    return mutex.try_lock_for(boost::chrono::milliseconds(timeout.count()));
+      const std::chrono::duration<Rep, Period>& timeout) {
+    return mutex.try_lock_for(detail::toBoostDuration(timeout));
   }
 
   }
 
+  template <class Rep, class Period>
   static bool try_lock_shared_for(
       boost::shared_mutex& mutex,
   static bool try_lock_shared_for(
       boost::shared_mutex& mutex,
-      std::chrono::milliseconds timeout) {
-    // Convert the std::chrono argument to boost::chrono
-    return mutex.try_lock_shared_for(
-        boost::chrono::milliseconds(timeout.count()));
+      const std::chrono::duration<Rep, Period>& timeout) {
+    return mutex.try_lock_shared_for(detail::toBoostDuration(timeout));
   }
 };
 
   }
 };
 
@@ -64,11 +72,11 @@ struct LockTraits<boost::timed_mutex>
   static constexpr bool is_shared = false;
   static constexpr bool is_timed = true;
 
   static constexpr bool is_shared = false;
   static constexpr bool is_timed = true;
 
+  template <class Rep, class Period>
   static bool try_lock_for(
       boost::timed_mutex& mutex,
   static bool try_lock_for(
       boost::timed_mutex& mutex,
-      std::chrono::milliseconds timeout) {
-    // Convert the std::chrono argument to boost::chrono
-    return mutex.try_lock_for(boost::chrono::milliseconds(timeout.count()));
+      const std::chrono::duration<Rep, Period>& timeout) {
+    return mutex.try_lock_for(detail::toBoostDuration(timeout));
   }
 };
 
   }
 };
 
@@ -81,11 +89,11 @@ struct LockTraits<boost::recursive_timed_mutex>
   static constexpr bool is_shared = false;
   static constexpr bool is_timed = true;
 
   static constexpr bool is_shared = false;
   static constexpr bool is_timed = true;
 
+  template <class Rep, class Period>
   static bool try_lock_for(
       boost::recursive_timed_mutex& mutex,
   static bool try_lock_for(
       boost::recursive_timed_mutex& mutex,
-      std::chrono::milliseconds timeout) {
-    // Convert the std::chrono argument to boost::chrono
-    return mutex.try_lock_for(boost::chrono::milliseconds(timeout.count()));
+      const std::chrono::duration<Rep, Period>& timeout) {
+    return mutex.try_lock_for(detail::toBoostDuration(timeout));
   }
 };
 } // folly
   }
 };
 } // folly