Apache Qpid - AMQP Messaging for Java JMS, C++, Python, Ruby, and .NET Apache Qpid Documentation
Mutex.h
Go to the documentation of this file.
1 #ifndef _sys_posix_Mutex_h
2 #define _sys_posix_Mutex_h
3 
4 /*
5  *
6  * Copyright (c) 2006 The Apache Software Foundation
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21 
22 #include "qpid/sys/posix/check.h"
23 
24 #include <pthread.h>
25 #include <boost/noncopyable.hpp>
26 
27 namespace qpid {
28 namespace sys {
29 
30 class Condition;
31 
35 class Mutex : private boost::noncopyable {
36  friend class Condition;
37  static const pthread_mutexattr_t* getAttribute();
38 
39 public:
40  typedef ::qpid::sys::ScopedLock<Mutex> ScopedLock;
41  typedef ::qpid::sys::ScopedUnlock<Mutex> ScopedUnlock;
42 
43  inline Mutex();
44  inline ~Mutex();
45  inline void lock();
46  inline void unlock();
47  inline bool trylock();
48 
49 
50 protected:
51  pthread_mutex_t mutex;
52 };
53 
57 class RWlock : private boost::noncopyable {
58  friend class Condition;
59 
60 public:
61  typedef ::qpid::sys::ScopedRlock<RWlock> ScopedRlock;
62  typedef ::qpid::sys::ScopedWlock<RWlock> ScopedWlock;
63 
64  inline RWlock();
65  inline ~RWlock();
66  inline void wlock(); // will write-lock
67  inline void rlock(); // will read-lock
68  inline void unlock();
69  inline void trywlock(); // will write-try
70  inline void tryrlock(); // will read-try
71 
72 protected:
73  pthread_rwlock_t rwlock;
74 };
75 
76 
81 struct PODMutex
82 {
83  typedef ::qpid::sys::ScopedLock<PODMutex> ScopedLock;
84 
85  inline void lock();
86  inline void unlock();
87  inline bool trylock();
88 
89  // Must be public to be a POD:
90  pthread_mutex_t mutex;
91 };
92 
93 #define QPID_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER }
94 
96  QPID_POSIX_ASSERT_THROW_IF(pthread_mutex_lock(&mutex));
97 }
98 
100  QPID_POSIX_ASSERT_THROW_IF(pthread_mutex_unlock(&mutex));
101 }
102 
104  return pthread_mutex_trylock(&mutex) == 0;
105 }
106 
108  QPID_POSIX_ASSERT_THROW_IF(pthread_mutex_init(&mutex, getAttribute()));
109 }
110 
112  QPID_POSIX_ABORT_IF(pthread_mutex_destroy(&mutex));
113 }
114 
115 void Mutex::lock() {
116  QPID_POSIX_ASSERT_THROW_IF(pthread_mutex_lock(&mutex));
117 }
118 
120  QPID_POSIX_ASSERT_THROW_IF(pthread_mutex_unlock(&mutex));
121 }
122 
124  return pthread_mutex_trylock(&mutex) == 0;
125 }
126 
127 
129  QPID_POSIX_ASSERT_THROW_IF(pthread_rwlock_init(&rwlock, NULL));
130 }
131 
133  QPID_POSIX_ABORT_IF(pthread_rwlock_destroy(&rwlock));
134 }
135 
137  QPID_POSIX_ASSERT_THROW_IF(pthread_rwlock_wrlock(&rwlock));
138 }
139 
141  QPID_POSIX_ASSERT_THROW_IF(pthread_rwlock_rdlock(&rwlock));
142 }
143 
145  QPID_POSIX_ASSERT_THROW_IF(pthread_rwlock_unlock(&rwlock));
146 }
147 
149  QPID_POSIX_ASSERT_THROW_IF(pthread_rwlock_trywrlock(&rwlock));
150 }
151 
153  QPID_POSIX_ASSERT_THROW_IF(pthread_rwlock_tryrdlock(&rwlock));
154 }
155 
156 
157 }}
158 #endif

Qpid C++ API Reference
Generated on Mon Feb 11 2013 for Qpid C++ Client API by doxygen 1.8.1.1