blob: 56a60ce4016f12e6ae03958ca94c9071d051be05 [file] [log] [blame]
Jeff Thompson3d613fd2013-10-15 15:39:04 -07001#ifndef NDNBOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
2#define NDNBOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
Jeff Thompsonf7d49942013-08-01 16:47:40 -07003
4// MS compatible compilers support #pragma once
5
6#if defined(_MSC_VER) && (_MSC_VER >= 1020)
7# pragma once
8#endif
9
10//
Jeff Thompson9939dcd2013-10-15 15:12:24 -070011// ndnboost/detail/lwm_pthreads.hpp
Jeff Thompsonf7d49942013-08-01 16:47:40 -070012//
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_)
Jeff Thompson3d613fd2013-10-15 15:39:04 -070046 NDNBOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 );
Jeff Thompsonf7d49942013-08-01 16:47:40 -070047#else
Jeff Thompson3d613fd2013-10-15 15:39:04 -070048 NDNBOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
Jeff Thompsonf7d49942013-08-01 16:47:40 -070049#endif
50 }
51
52 ~lightweight_mutex()
53 {
Jeff Thompson3d613fd2013-10-15 15:39:04 -070054 NDNBOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
Jeff Thompsonf7d49942013-08-01 16:47:40 -070055 }
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 {
Jeff Thompson3d613fd2013-10-15 15:39:04 -070073 NDNBOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
Jeff Thompsonf7d49942013-08-01 16:47:40 -070074 }
75
76 ~scoped_lock()
77 {
Jeff Thompson3d613fd2013-10-15 15:39:04 -070078 NDNBOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
Jeff Thompsonf7d49942013-08-01 16:47:40 -070079 }
80 };
81};
82
83} // namespace detail
84
85} // namespace ndnboost
86
Jeff Thompson3d613fd2013-10-15 15:39:04 -070087#endif // #ifndef NDNBOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED