blob: 38bbc9169ccf88d2a789df9c464d0e0d74e7caeb [file] [log] [blame]
Jeff Thompsonf7d49942013-08-01 16:47:40 -07001#ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
2#define BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
3
4// MS compatible compilers support #pragma once
5
6#if defined(_MSC_VER) && (_MSC_VER >= 1020)
7# pragma once
8#endif
9
10//
11// boost/detail/lwm_pthreads.hpp
12//
13// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
14//
15// Distributed under the Boost Software License, Version 1.0. (See
16// accompanying file LICENSE_1_0.txt or copy at
17// http://www.boost.org/LICENSE_1_0.txt)
18//
19
Jeff Thompson2277ce52013-08-01 17:34:11 -070020#include <ndnboost/assert.hpp>
Jeff Thompsonf7d49942013-08-01 16:47:40 -070021#include <pthread.h>
22
23namespace ndnboost
24{
25
26namespace detail
27{
28
29class lightweight_mutex
30{
31private:
32
33 pthread_mutex_t m_;
34
35 lightweight_mutex(lightweight_mutex const &);
36 lightweight_mutex & operator=(lightweight_mutex const &);
37
38public:
39
40 lightweight_mutex()
41 {
42
43// HPUX 10.20 / DCE has a nonstandard pthread_mutex_init
44
45#if defined(__hpux) && defined(_DECTHREADS_)
46 BOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 );
47#else
48 BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
49#endif
50 }
51
52 ~lightweight_mutex()
53 {
54 BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
55 }
56
57 class scoped_lock;
58 friend class scoped_lock;
59
60 class scoped_lock
61 {
62 private:
63
64 pthread_mutex_t & m_;
65
66 scoped_lock(scoped_lock const &);
67 scoped_lock & operator=(scoped_lock const &);
68
69 public:
70
71 scoped_lock(lightweight_mutex & m): m_(m.m_)
72 {
73 BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
74 }
75
76 ~scoped_lock()
77 {
78 BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
79 }
80 };
81};
82
83} // namespace detail
84
85} // namespace ndnboost
86
87#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED