os/ossrv/ossrv_pub/boost_apis/boost/thread/detail/lock.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (C) 2001-2003
sl@0
     2
// William E. Kempf
sl@0
     3
//
sl@0
     4
//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
sl@0
     5
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
sl@0
     6
sl@0
     7
#ifndef BOOST_XLOCK_WEK070601_HPP
sl@0
     8
#define BOOST_XLOCK_WEK070601_HPP
sl@0
     9
sl@0
    10
#include <boost/thread/detail/config.hpp>
sl@0
    11
sl@0
    12
#include <boost/utility.hpp>
sl@0
    13
#include <boost/thread/exceptions.hpp>
sl@0
    14
sl@0
    15
namespace boost {
sl@0
    16
sl@0
    17
class condition;
sl@0
    18
struct xtime;
sl@0
    19
sl@0
    20
namespace detail { namespace thread {
sl@0
    21
sl@0
    22
template <typename Mutex>
sl@0
    23
class lock_ops : private noncopyable
sl@0
    24
{
sl@0
    25
private:
sl@0
    26
    lock_ops() { }
sl@0
    27
sl@0
    28
public:
sl@0
    29
    typedef typename Mutex::cv_state lock_state;
sl@0
    30
sl@0
    31
    static void lock(Mutex& m)
sl@0
    32
    {
sl@0
    33
        m.do_lock();
sl@0
    34
    }
sl@0
    35
    static bool trylock(Mutex& m)
sl@0
    36
    {
sl@0
    37
        return m.do_trylock();
sl@0
    38
    }
sl@0
    39
    static bool timedlock(Mutex& m, const xtime& xt)
sl@0
    40
    {
sl@0
    41
        return m.do_timedlock(xt);
sl@0
    42
    }
sl@0
    43
    static void unlock(Mutex& m)
sl@0
    44
    {
sl@0
    45
        m.do_unlock();
sl@0
    46
    }
sl@0
    47
    static void lock(Mutex& m, lock_state& state)
sl@0
    48
    {
sl@0
    49
        m.do_lock(state);
sl@0
    50
    }
sl@0
    51
    static void unlock(Mutex& m, lock_state& state)
sl@0
    52
    {
sl@0
    53
        m.do_unlock(state);
sl@0
    54
    }
sl@0
    55
};
sl@0
    56
sl@0
    57
template <typename Mutex>
sl@0
    58
class scoped_lock : private noncopyable
sl@0
    59
{
sl@0
    60
public:
sl@0
    61
    typedef Mutex mutex_type;
sl@0
    62
sl@0
    63
    explicit scoped_lock(Mutex& mx, bool initially_locked=true)
sl@0
    64
        : m_mutex(mx), m_locked(false)
sl@0
    65
    {
sl@0
    66
        if (initially_locked) lock();
sl@0
    67
    }
sl@0
    68
    ~scoped_lock()
sl@0
    69
    {
sl@0
    70
        if (m_locked) unlock();
sl@0
    71
    }
sl@0
    72
sl@0
    73
    void lock()
sl@0
    74
    {
sl@0
    75
        if (m_locked) throw lock_error();
sl@0
    76
        lock_ops<Mutex>::lock(m_mutex);
sl@0
    77
        m_locked = true;
sl@0
    78
    }
sl@0
    79
    void unlock()
sl@0
    80
    {
sl@0
    81
        if (!m_locked) throw lock_error();
sl@0
    82
        lock_ops<Mutex>::unlock(m_mutex);
sl@0
    83
        m_locked = false;
sl@0
    84
    }
sl@0
    85
sl@0
    86
    bool locked() const { return m_locked; }
sl@0
    87
    operator const void*() const { return m_locked ? this : 0; }
sl@0
    88
sl@0
    89
private:
sl@0
    90
    friend class boost::condition;
sl@0
    91
sl@0
    92
    Mutex& m_mutex;
sl@0
    93
    bool m_locked;
sl@0
    94
};
sl@0
    95
sl@0
    96
template <typename TryMutex>
sl@0
    97
class scoped_try_lock : private noncopyable
sl@0
    98
{
sl@0
    99
public:
sl@0
   100
    typedef TryMutex mutex_type;
sl@0
   101
sl@0
   102
    explicit scoped_try_lock(TryMutex& mx)
sl@0
   103
        : m_mutex(mx), m_locked(false)
sl@0
   104
    {
sl@0
   105
        try_lock();
sl@0
   106
    }
sl@0
   107
    scoped_try_lock(TryMutex& mx, bool initially_locked)
sl@0
   108
        : m_mutex(mx), m_locked(false)
sl@0
   109
    {
sl@0
   110
        if (initially_locked) lock();
sl@0
   111
    }
sl@0
   112
    ~scoped_try_lock()
sl@0
   113
    {
sl@0
   114
        if (m_locked) unlock();
sl@0
   115
    }
sl@0
   116
sl@0
   117
    void lock()
sl@0
   118
    {
sl@0
   119
        if (m_locked) throw lock_error();
sl@0
   120
        lock_ops<TryMutex>::lock(m_mutex);
sl@0
   121
        m_locked = true;
sl@0
   122
    }
sl@0
   123
    bool try_lock()
sl@0
   124
    {
sl@0
   125
        if (m_locked) throw lock_error();
sl@0
   126
        return (m_locked = lock_ops<TryMutex>::trylock(m_mutex));
sl@0
   127
    }
sl@0
   128
    void unlock()
sl@0
   129
    {
sl@0
   130
        if (!m_locked) throw lock_error();
sl@0
   131
        lock_ops<TryMutex>::unlock(m_mutex);
sl@0
   132
        m_locked = false;
sl@0
   133
    }
sl@0
   134
sl@0
   135
    bool locked() const { return m_locked; }
sl@0
   136
    operator const void*() const { return m_locked ? this : 0; }
sl@0
   137
sl@0
   138
private:
sl@0
   139
    friend class boost::condition;
sl@0
   140
sl@0
   141
    TryMutex& m_mutex;
sl@0
   142
    bool m_locked;
sl@0
   143
};
sl@0
   144
sl@0
   145
template <typename TimedMutex>
sl@0
   146
class scoped_timed_lock : private noncopyable
sl@0
   147
{
sl@0
   148
public:
sl@0
   149
    typedef TimedMutex mutex_type;
sl@0
   150
sl@0
   151
    scoped_timed_lock(TimedMutex& mx, const xtime& xt)
sl@0
   152
        : m_mutex(mx), m_locked(false)
sl@0
   153
    {
sl@0
   154
        timed_lock(xt);
sl@0
   155
    }
sl@0
   156
    scoped_timed_lock(TimedMutex& mx, bool initially_locked)
sl@0
   157
        : m_mutex(mx), m_locked(false)
sl@0
   158
    {
sl@0
   159
        if (initially_locked) lock();
sl@0
   160
    }
sl@0
   161
    ~scoped_timed_lock()
sl@0
   162
    {
sl@0
   163
        if (m_locked) unlock();
sl@0
   164
    }
sl@0
   165
sl@0
   166
    void lock()
sl@0
   167
    {
sl@0
   168
        if (m_locked) throw lock_error();
sl@0
   169
        lock_ops<TimedMutex>::lock(m_mutex);
sl@0
   170
        m_locked = true;
sl@0
   171
    }
sl@0
   172
    bool try_lock()
sl@0
   173
    {
sl@0
   174
        if (m_locked) throw lock_error();
sl@0
   175
        return (m_locked = lock_ops<TimedMutex>::trylock(m_mutex));
sl@0
   176
    }
sl@0
   177
    bool timed_lock(const xtime& xt)
sl@0
   178
    {
sl@0
   179
        if (m_locked) throw lock_error();
sl@0
   180
        return (m_locked = lock_ops<TimedMutex>::timedlock(m_mutex, xt));
sl@0
   181
    }
sl@0
   182
    void unlock()
sl@0
   183
    {
sl@0
   184
        if (!m_locked) throw lock_error();
sl@0
   185
        lock_ops<TimedMutex>::unlock(m_mutex);
sl@0
   186
        m_locked = false;
sl@0
   187
    }
sl@0
   188
sl@0
   189
    bool locked() const { return m_locked; }
sl@0
   190
    operator const void*() const { return m_locked ? this : 0; }
sl@0
   191
sl@0
   192
private:
sl@0
   193
    friend class boost::condition;
sl@0
   194
sl@0
   195
    TimedMutex& m_mutex;
sl@0
   196
    bool m_locked;
sl@0
   197
};
sl@0
   198
sl@0
   199
} // namespace thread
sl@0
   200
} // namespace detail
sl@0
   201
} // namespace boost
sl@0
   202
sl@0
   203
#endif // BOOST_XLOCK_WEK070601_HPP
sl@0
   204
sl@0
   205
// Change Log:
sl@0
   206
//    8 Feb 01  WEKEMPF Initial version.
sl@0
   207
//   22 May 01  WEKEMPF Modified to use xtime for time outs.
sl@0
   208
//   30 Jul 01  WEKEMPF Moved lock types into boost::detail::thread. Renamed
sl@0
   209
//                      some types. Added locked() methods.