poly_shared_lockable.hpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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(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(duration_cast<Clock::duration>(rel_time));
  36. }
  37. };
  38. //]
  39. //[upgrade_poly_lockable
  40. class upgrade_poly_lockable: public shared_poly_lockable
  41. {
  42. public:
  43. virtual ~upgrade_poly_lockable() = 0;
  44. virtual void lock_upgrade() = 0;
  45. virtual bool try_lock_upgrade() = 0;
  46. virtual void unlock_upgrade() = 0;
  47. virtual bool try_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
  48. virtual bool try_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
  49. template <typename Clock, typename Duration>
  50. bool try_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
  51. {
  52. return try_lock_upgrade_until(time_point_cast<Clock::time_point>(abs_time));
  53. }
  54. virtual bool try_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
  55. template <typename Rep, typename Period>
  56. bool try_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
  57. {
  58. return try_lock_upgrade_for(duration_cast<Clock::duration>(rel_time));
  59. }
  60. virtual bool try_unlock_shared_and_lock() = 0;
  61. virtual bool try_unlock_shared_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
  62. virtual bool try_unlock_shared_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
  63. template <typename Clock, typename Duration>
  64. bool try_unlock_shared_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
  65. {
  66. return try_unlock_shared_and_lock_until(time_point_cast<Clock::time_point>(abs_time));
  67. }
  68. virtual bool try_unlock_shared_and_lock_for(chrono::nanoseconds const & relative_time)=0;
  69. template <typename Rep, typename Period>
  70. bool try_unlock_shared_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
  71. {
  72. return try_unlock_shared_and_lock_for(duration_cast<Clock::duration>(rel_time));
  73. }
  74. virtual void unlock_and_lock_shared() = 0;
  75. virtual bool try_unlock_shared_and_lock_upgrade() = 0;
  76. virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
  77. virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
  78. template <typename Clock, typename Duration>
  79. bool try_unlock_shared_and_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
  80. {
  81. return try_unlock_shared_and_lock_upgrade_until(time_point_cast<Clock::time_point>(abs_time));
  82. }
  83. virtual bool try_unlock_shared_and_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
  84. template <typename Rep, typename Period>
  85. bool try_unlock_shared_and_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
  86. {
  87. return try_unlock_shared_and_lock_upgrade_for(duration_cast<Clock::duration>(rel_time));
  88. }
  89. virtual void unlock_and_lock_upgrade() = 0;
  90. virtual void unlock_upgrade_and_lock() = 0;
  91. virtual bool try_unlock_upgrade_and_lock() = 0;
  92. virtual bool try_unlock_upgrade_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
  93. virtual bool try_unlock_upgrade_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
  94. template <typename Clock, typename Duration>
  95. bool try_unlock_upgrade_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
  96. {
  97. return try_unlock_upgrade_and_lock_until(time_point_cast<Clock::time_point>(abs_time));
  98. }
  99. virtual bool try_unlock_upgrade_and_lock_for(chrono::nanoseconds const & relative_time)=0;
  100. template <typename Rep, typename Period>
  101. bool try_unlock_upgrade_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
  102. {
  103. return try_unlock_upgrade_and_lock_for(duration_cast<Clock::duration>(rel_time));
  104. }
  105. virtual void unlock_upgrade_and_lock_shared() = 0;
  106. };
  107. //]
  108. }
  109. #endif