poly_shared_lockable.hpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Vicente J. Botet Escriba 2008-2009,2012. Distributed under the Boost
  4. // Software License, Version 1.0. (See accompanying file
  5. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/libs/thread for documentation.
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #ifndef BOOST_THREAD_POLY_SHARED_LOCKABLE_HPP
  11. #define BOOST_THREAD_POLY_SHARED_LOCKABLE_HPP
  12. #include <boost/thread/poly_lockable.hpp>
  13. #include <boost/chrono/chrono.hpp>
  14. namespace boost
  15. {
  16. //[shared_poly_lockable
  17. class shared_poly_lockable: public timed_poly_lockable
  18. {
  19. public:
  20. virtual ~shared_poly_lockable() = 0;
  21. virtual void lock_shared() = 0;
  22. virtual bool try_lock_shared() = 0;
  23. virtual void unlock_shared() = 0;
  24. virtual bool try_lock_shared_until(chrono::system_clock::time_point const & abs_time)=0;
  25. virtual bool try_lock_shared_until(chrono::steady_clock::time_point const & abs_time)=0;
  26. template <typename Clock, typename Duration>
  27. bool try_lock_shared_until(chrono::time_point<Clock, Duration> const & abs_time)
  28. {
  29. return try_lock_shared_until(chrono::time_point_cast<Clock::time_point>(abs_time));
  30. }
  31. virtual bool try_lock_shared_for(chrono::nanoseconds const & relative_time)=0;
  32. template <typename Rep, typename Period>
  33. bool try_lock_shared_for(chrono::duration<Rep, Period> const & rel_time)
  34. {
  35. return try_lock_shared_for(chrono::duration_cast<chrono::nanoseconds>(rel_time));
  36. }
  37. };
  38. //]
  39. // A proper name for shared_poly_lockable, consistent with naming scheme of other polymorphic wrappers
  40. typedef shared_poly_lockable poly_shared_lockable;
  41. //[upgrade_poly_lockable
  42. class upgrade_poly_lockable: public shared_poly_lockable
  43. {
  44. public:
  45. virtual ~upgrade_poly_lockable() = 0;
  46. virtual void lock_upgrade() = 0;
  47. virtual bool try_lock_upgrade() = 0;
  48. virtual void unlock_upgrade() = 0;
  49. virtual bool try_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
  50. virtual bool try_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
  51. template <typename Clock, typename Duration>
  52. bool try_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
  53. {
  54. return try_lock_upgrade_until(chrono::time_point_cast<Clock::time_point>(abs_time));
  55. }
  56. virtual bool try_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
  57. template <typename Rep, typename Period>
  58. bool try_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
  59. {
  60. return try_lock_upgrade_for(chrono::duration_cast<chrono::nanoseconds>(rel_time));
  61. }
  62. virtual bool try_unlock_shared_and_lock() = 0;
  63. virtual bool try_unlock_shared_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
  64. virtual bool try_unlock_shared_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
  65. template <typename Clock, typename Duration>
  66. bool try_unlock_shared_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
  67. {
  68. return try_unlock_shared_and_lock_until(chrono::time_point_cast<Clock::time_point>(abs_time));
  69. }
  70. virtual bool try_unlock_shared_and_lock_for(chrono::nanoseconds const & relative_time)=0;
  71. template <typename Rep, typename Period>
  72. bool try_unlock_shared_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
  73. {
  74. return try_unlock_shared_and_lock_for(chrono::duration_cast<chrono::nanoseconds>(rel_time));
  75. }
  76. virtual void unlock_and_lock_shared() = 0;
  77. virtual bool try_unlock_shared_and_lock_upgrade() = 0;
  78. virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
  79. virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
  80. template <typename Clock, typename Duration>
  81. bool try_unlock_shared_and_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
  82. {
  83. return try_unlock_shared_and_lock_upgrade_until(chrono::time_point_cast<Clock::time_point>(abs_time));
  84. }
  85. virtual bool try_unlock_shared_and_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
  86. template <typename Rep, typename Period>
  87. bool try_unlock_shared_and_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
  88. {
  89. return try_unlock_shared_and_lock_upgrade_for(chrono::duration_cast<chrono::nanoseconds>(rel_time));
  90. }
  91. virtual void unlock_and_lock_upgrade() = 0;
  92. virtual void unlock_upgrade_and_lock() = 0;
  93. virtual bool try_unlock_upgrade_and_lock() = 0;
  94. virtual bool try_unlock_upgrade_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
  95. virtual bool try_unlock_upgrade_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
  96. template <typename Clock, typename Duration>
  97. bool try_unlock_upgrade_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
  98. {
  99. return try_unlock_upgrade_and_lock_until(chrono::time_point_cast<Clock::time_point>(abs_time));
  100. }
  101. virtual bool try_unlock_upgrade_and_lock_for(chrono::nanoseconds const & relative_time)=0;
  102. template <typename Rep, typename Period>
  103. bool try_unlock_upgrade_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
  104. {
  105. return try_unlock_upgrade_and_lock_for(chrono::duration_cast<chrono::nanoseconds>(rel_time));
  106. }
  107. virtual void unlock_upgrade_and_lock_shared() = 0;
  108. };
  109. //]
  110. // A proper name for upgrade_poly_lockable, consistent with naming scheme of other polymorphic wrappers
  111. typedef upgrade_poly_lockable poly_upgrade_lockable;
  112. }
  113. #endif