summaryrefslogtreecommitdiff
path: root/boost/thread/poly_shared_lockable.hpp
blob: 4348ed76c250780b939c9fe9890c22ed6dce86c1 (plain)
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
//////////////////////////////////////////////////////////////////////////////
//
// (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(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(duration_cast<Clock::duration>(rel_time));
    }

  };

  //]

  //[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(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(duration_cast<Clock::duration>(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(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(duration_cast<Clock::duration>(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(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(duration_cast<Clock::duration>(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(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(duration_cast<Clock::duration>(rel_time));
    }

    virtual void unlock_upgrade_and_lock_shared() = 0;

  };
//]

}
#endif