1//
2// detail/posix_mutex.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~
4//
5// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6//
7// Distributed under the Boost Software License, Version 1.0. (See accompanying
8// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9//
10
11#ifndef ASIO_DETAIL_POSIX_MUTEX_HPP
12#define ASIO_DETAIL_POSIX_MUTEX_HPP
13
14
15#include "asio/detail/config.hpp"
16
17#if defined(ASIO_HAS_PTHREADS)
18
19#include <pthread.h>
20#include "asio/detail/noncopyable.hpp"
21#include "asio/detail/scoped_lock.hpp"
22
23#include "asio/detail/push_options.hpp"
24
25namespace asio {
26namespace detail {
27
28class posix_event;
29
30class posix_mutex
31  : private noncopyable
32{
33public:
34  typedef asio::detail::scoped_lock<posix_mutex> scoped_lock;
35
36  // Constructor.
37  ASIO_DECL posix_mutex();
38
39  // Destructor.
40  ~posix_mutex()
41  {
42    ::pthread_mutex_destroy(&mutex_); // Ignore EBUSY.
43  }
44
45  // Lock the mutex.
46  void lock()
47  {
48    (void)::pthread_mutex_lock(&mutex_); // Ignore EINVAL.
49  }
50
51  // Unlock the mutex.
52  void unlock()
53  {
54    (void)::pthread_mutex_unlock(&mutex_); // Ignore EINVAL.
55  }
56
57private:
58  friend class posix_event;
59  ::pthread_mutex_t mutex_;
60};
61
62} // namespace detail
63} // namespace asio
64
65#include "asio/detail/pop_options.hpp"
66
67# include "asio/detail/impl/posix_mutex.ipp"
68
69#endif // defined(ASIO_HAS_PTHREADS)
70
71#endif // ASIO_DETAIL_POSIX_MUTEX_HPP
72