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