IBR-DTNSuite  0.10
RWMutex.cpp
Go to the documentation of this file.
1 /*
2  * RWMutex.cpp
3  *
4  * Copyright (C) 2011 IBR, TU Braunschweig
5  *
6  * Written-by: Johannes Morgenroth <morgenroth@ibr.cs.tu-bs.de>
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 
23 #include <errno.h>
24 
25 namespace ibrcommon
26 {
28  {
29  pthread_rwlock_init(&_rwlock, NULL);
30  }
31 
33  {
34  pthread_rwlock_destroy(&_rwlock);
35  }
36 
38  {
39  int ret = 0;
40 
41  switch (state) {
42  case LOCK_READONLY:
43  ret = pthread_rwlock_tryrdlock(&_rwlock);
44  break;
45 
46  case LOCK_READWRITE:
47  ret = pthread_rwlock_trywrlock(&_rwlock);
48  break;
49  }
50 
51  switch (ret)
52  {
53  case 0:
54  break;
55 
56  case EBUSY:
57  throw MutexException("The mutex could not be acquired because it was already locked.");
58  break;
59  }
60  }
61 
63  {
64  switch (state) {
65  case LOCK_READONLY:
66  pthread_rwlock_rdlock(&_rwlock);
67  break;
68 
69  case LOCK_READWRITE:
70  pthread_rwlock_wrlock(&_rwlock);
71  break;
72  }
73  }
74 
76  {
77  pthread_rwlock_unlock(&_rwlock);
78  }
79 } /* namespace ibrcommon */