Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Sync.C
Go to the documentation of this file.
1 /* *******************************************************************
2  * Rocstar Simulation Suite *
3  * Copyright@2015, Illinois Rocstar LLC. All rights reserved. *
4  * *
5  * Illinois Rocstar LLC *
6  * Champaign, IL *
7  * www.illinoisrocstar.com *
8  * sales@illinoisrocstar.com *
9  * *
10  * License: See LICENSE file in top level of distribution package or *
11  * http://opensource.org/licenses/NCSA *
12  *********************************************************************/
13 /* *******************************************************************
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *
16  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *
17  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR *
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
21  * USE OR OTHER DEALINGS WITH THE SOFTWARE. *
22  *********************************************************************/
23 #include <iostream>
24 #include <pthread.h>
25 #include <errno.h>
26 #include "Sync.h"
27 #include "commpi.h"
28 
30 {
31  int err = pthread_mutex_init(&m_mutex, NULL);
32  m_isOk = (err == 0);
33  if (!m_isOk) {
34  std::cerr << "Mutex::Mutex(): pthread_mutex_init() returned " << err
35  << std::endl;
36  }
37 }
38 
40 {
41  if (m_isOk) {
42  int err = pthread_mutex_destroy(&m_mutex);
43  if (err != 0 && !COMMPI_Initialized()) {
44  std::cerr << "Mutex::~Mutex(): pthread_mutex_destroy() returned " << err
45  << std::endl;
46  }
47  }
48 }
49 
51 {
52  int err = pthread_mutex_lock(&m_mutex);
53  switch (err) {
54  case 0:
55  break;
56 
57  case EDEADLK:
58  std::cerr << "Mutex::Lock(): mutex deadlock prevented." << std::endl;
59  break;
60 
61  case EINVAL:
62  std::cerr << "Mutex::Lock(): mutex not initialized." << std::endl;
63  break;
64 
65  default:
66  std::cerr << "Mutex::Lock(): pthread_mutex_lock() returned " << err
67  << std::endl;
68  break;
69  }
70 
71  return err;
72 }
73 
75 {
76  int err = pthread_mutex_trylock(&m_mutex);
77  switch (err) {
78  case 0:
79  case EBUSY:
80  break;
81 
82  case EINVAL:
83  std::cerr << "Mutex::TryLock(): mutex not initialized." << std::endl;
84  break;
85 
86  default:
87  std::cerr << "Mutex::TryLock(): pthread_mutex_trylock() returned "
88  << err << std::endl;
89  break;
90  }
91 
92  return err;
93 }
94 
96 {
97  int err = pthread_mutex_unlock(&m_mutex);
98  switch (err) {
99  case 0:
100  case EPERM:
101  break;
102 
103  case EINVAL:
104  std::cerr << "Mutex::Unlock(): mutex not initialized." << std::endl;
105  break;
106 
107  default:
108  std::cerr << "Mutex::Unlock(): pthread_mutex_unlock() returned " << err
109  << std::endl;
110  break;
111  }
112 
113  return err;
114 }
115 
117 : m_mutex(mutex)
118 {
119  int err = pthread_cond_init(&m_cond, NULL);
120 
121  m_isOk = (err == 0);
122 
123  if (!m_isOk) {
124  std::cerr << "Condition::Condition(): pthread_cond_init() returned " << err
125  << std::endl;
126  }
127 }
128 
130 {
131  if (m_isOk) {
132  int err = pthread_cond_destroy(&m_cond);
133  if (err != 0 && !COMMPI_Initialized()) {
134  std::cerr << "Condition::~Condition(): pthread_cond_destroy() returned "
135  << err << std::endl;
136  }
137  }
138 }
139 
141 {
142  int err = pthread_cond_wait(&m_cond, &(m_mutex.m_mutex));
143  if (err != 0)
144  std::cerr << "Condition::Wait(): pthread_cond_wait() returned " << err
145  << std::endl;
146 
147  return err;
148 }
149 
151 {
152  int err = pthread_cond_signal(&m_cond);
153  if (err != 0)
154  std::cerr << "Condition::Signal(): pthread_cond_signal() returned " << err
155  << std::endl;
156 
157  return err;
158 }
159 
161 {
162  int err = pthread_cond_broadcast(&m_cond);
163  if (err != 0)
164  std::cerr << "Condition::Broadcast(): pthread_cond_broadcast() returned "
165  << err << std::endl;
166 
167  return err;
168 }
169 
170 Semaphore::Semaphore(int initialcount, int maxcount)
171 : m_cond(m_mutex)
172 {
173  if ((initialcount < 0 || maxcount < 0)
174  || ((maxcount > 0) && (initialcount > maxcount))) {
175  std::cerr << "Semaphore::Semaphore(): invalid initial or maximal count."
176  << std::endl;
177 
178  m_isOk = false;
179  } else {
180  m_maxcount = maxcount;
181  m_count = initialcount;
182  }
183 
184  m_isOk = m_mutex.IsOk() && m_cond.IsOk();
185 }
186 
188 {
189 }
190 
192 {
193  m_mutex.Lock();
194 
195  while (m_count == 0) {
196  if (m_cond.Wait() != 0) {
197  m_mutex.Unlock();
198  return false;
199  }
200  }
201 
202  --m_count;
203  m_mutex.Unlock();
204 
205  return true;
206 }
207 
209 {
210  m_mutex.Lock();
211 
212  if (m_count == 0) {
213  m_mutex.Unlock();
214  return false;
215  }
216 
217  --m_count;
218  m_mutex.Unlock();
219 
220  return true;
221 }
222 
224 {
225  m_mutex.Lock();
226 
227  if (m_maxcount > 0 && m_count == m_maxcount) {
228  m_mutex.Unlock();
229  return false;
230  }
231 
232  ++m_count;
233 
234  int result = m_cond.Signal();
235  m_mutex.Unlock();
236 
237  return (result == 0);
238 }
239 
240 
241 
242 
243 
244 
Condition(Mutex &mutex)
Definition: Sync.C:116
bool IsOk() const
Definition: Sync.h:53
int m_count
Definition: Sync.h:80
bool IsOk() const
Definition: Sync.h:34
int Lock()
Definition: Sync.C:50
~Mutex()
Definition: Sync.C:39
bool m_isOk
Definition: Sync.h:44
Definition: Sync.h:28
int Unlock()
Definition: Sync.C:95
bool m_isOk
Definition: Sync.h:82
~Condition()
Definition: Sync.C:129
Condition m_cond
Definition: Sync.h:79
Mutex & m_mutex
Definition: Sync.h:60
pthread_cond_t m_cond
Definition: Sync.h:61
pthread_mutex_t m_mutex
Definition: Sync.h:43
Contains declarations of MPI subroutines used in Roccom.
int TryLock()
Definition: Sync.C:74
Mutex m_mutex
Definition: Sync.h:78
bool Wait()
Definition: Sync.C:191
bool TryWait()
Definition: Sync.C:208
Semaphore(int initialcount=0, int maxcount=0)
Definition: Sync.C:170
int Wait()
Definition: Sync.C:140
bool Post()
Definition: Sync.C:223
int Broadcast()
Definition: Sync.C:160
Mutex()
Definition: Sync.C:29
int COMMPI_Initialized()
Definition: commpi.h:168
int m_maxcount
Definition: Sync.h:81
int Signal()
Definition: Sync.C:150
~Semaphore()
Definition: Sync.C:187
bool m_isOk
Definition: Sync.h:62