This is Unofficial EPICS BASE Doxygen Site
osdMutex.c File Reference
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include "epicsMutex.h"
#include "cantProceed.h"
#include "epicsTime.h"
#include "errlog.h"
#include "epicsAssert.h"
+ Include dependency graph for osdMutex.c:

Go to the source code of this file.

Classes

struct  epicsMutexOSD
 

Macros

#define checkStatus(status, message)
 
#define checkStatusQuit(status, message, method)
 

Typedefs

typedef struct epicsMutexOSD epicsMutexOSD
 

Functions

epicsMutexOSDepicsMutexOsdCreate (void)
 
void epicsMutexOsdDestroy (struct epicsMutexOSD *pmutex)
 
void epicsMutexOsdUnlock (struct epicsMutexOSD *pmutex)
 
epicsMutexLockStatus epicsMutexOsdLock (struct epicsMutexOSD *pmutex)
 
epicsMutexLockStatus epicsMutexOsdTryLock (struct epicsMutexOSD *pmutex)
 
void epicsMutexOsdShow (struct epicsMutexOSD *pmutex, unsigned int level)
 

Macro Definition Documentation

#define checkStatus (   status,
  message 
)
Value:
if((status)) { \
errlogPrintf("epicsMutex %s failed: error %s\n", \
(message), strerror((status))); \
}
pvd::Status status
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105

Definition at line 29 of file osdMutex.c.

#define checkStatusQuit (   status,
  message,
  method 
)
Value:
if(status) { \
errlogPrintf("epicsMutex %s failed: error %s\n", \
(message), strerror((status))); \
cantProceed((method)); \
}
pvd::Status status
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54

Definition at line 34 of file osdMutex.c.

Typedef Documentation

typedef struct epicsMutexOSD epicsMutexOSD

Function Documentation

epicsMutexOSD* epicsMutexOsdCreate ( void  )

The following are interfaces to the OS dependent implementation and should NOT be called directly by user code.

Definition at line 175 of file osdMutex.c.

175  {
176  epicsMutexOSD *pmutex;
177  int status;
178 
179  pmutex = calloc(1, sizeof(*pmutex));
180  if(!pmutex)
181  return NULL;
182 
183  status = pthread_mutexattr_init(&pmutex->mutexAttr);
184  if(status)
185  goto fail;
186 
187 #if defined(_POSIX_THREAD_PRIO_INHERIT) && _POSIX_THREAD_PRIO_INHERIT > 0
188  status = pthread_mutexattr_setprotocol(
189  &pmutex->mutexAttr,PTHREAD_PRIO_INHERIT);
190  if (errVerbose) checkStatus(status, "pthread_mutexattr_setprotocal");
191 #endif /*_POSIX_THREAD_PRIO_INHERIT*/
192 
193  status = pthread_mutex_init(&pmutex->lock, &pmutex->mutexAttr);
194  if(status)
195  goto dattr;
196 
197 #if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED > 0
198  status = pthread_condattr_init(&pmutex->condAttr);
199  checkStatus(status, "pthread_condattr_init");
200  status = pthread_condattr_setpshared(&pmutex->condAttr,
201  PTHREAD_PROCESS_PRIVATE);
202  checkStatus(status, "pthread_condattr_setpshared");
203  status = pthread_cond_init(&pmutex->waitToBeOwner, &pmutex->condAttr);
204 #else
205  status = pthread_cond_init(&pmutex->waitToBeOwner, 0);
206 #endif /*_POSIX_THREAD_PROCESS_SHARED*/
207  if(status)
208  goto dmutex;
209 
210  return pmutex;
211 
212 dmutex:
213  pthread_mutex_destroy(&pmutex->lock);
214 dattr:
215  pthread_mutexattr_destroy(&pmutex->mutexAttr);
216 fail:
217  free(pmutex);
218  return NULL;
219 }
pvd::Status status
pthread_mutex_t lock
Definition: osdMutex.c:164
#define NULL
Definition: catime.c:38
#define checkStatus(status, message)
Definition: osdMutex.c:29
int errVerbose
Definition: errlog.c:41
pthread_mutexattr_t mutexAttr
Definition: osdMutex.c:165
pthread_cond_t waitToBeOwner
Definition: osdMutex.c:166
void epicsMutexOsdDestroy ( struct epicsMutexOSD pmutex)

Definition at line 221 of file osdMutex.c.

222 {
223  int status;
224 
225  status = pthread_cond_destroy(&pmutex->waitToBeOwner);
226  checkStatus(status, "pthread_cond_destroy");
227 #if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED > 0
228  status = pthread_condattr_destroy(&pmutex->condAttr);
229 #endif /*_POSIX_THREAD_PROCESS_SHARED*/
230  status = pthread_mutex_destroy(&pmutex->lock);
231  checkStatus(status, "pthread_mutex_destroy");
232  status = pthread_mutexattr_destroy(&pmutex->mutexAttr);
233  checkStatus(status, "pthread_mutexattr_destroy");
234  free(pmutex);
235 }
pvd::Status status
pthread_mutex_t lock
Definition: osdMutex.c:164
#define checkStatus(status, message)
Definition: osdMutex.c:29
pthread_mutexattr_t mutexAttr
Definition: osdMutex.c:165
pthread_cond_t waitToBeOwner
Definition: osdMutex.c:166
epicsMutexLockStatus epicsMutexOsdLock ( struct epicsMutexOSD pmutex)

Definition at line 276 of file osdMutex.c.

277 {
278  pthread_t tid = pthread_self();
279  int status;
280 
281  if (!pmutex || !tid) return epicsMutexLockError;
282  status = mutexLock(&pmutex->lock);
283  if (status == EINVAL) return epicsMutexLockError;
284  checkStatus(status, "pthread_mutex_lock epicsMutexOsdLock");
285  if(status)
286  return epicsMutexLockError;
287 
288  while (pmutex->owned && !pthread_equal(pmutex->ownerTid, tid))
289  condWait(&pmutex->waitToBeOwner, &pmutex->lock);
290  pmutex->ownerTid = tid;
291  pmutex->owned = 1;
292  pmutex->count++;
293 
294  status = pthread_mutex_unlock(&pmutex->lock);
295  checkStatus(status, "pthread_mutex_unlock epicsMutexOsdLock");
296  if(status)
297  return epicsMutexLockError;
298  return epicsMutexLockOK;
299 }
pvd::Status status
pthread_mutex_t lock
Definition: osdMutex.c:164
pthread_t ownerTid
Definition: osdMutex.c:172
#define checkStatus(status, message)
Definition: osdMutex.c:29
pthread_cond_t waitToBeOwner
Definition: osdMutex.c:166
void epicsMutexOsdShow ( struct epicsMutexOSD pmutex,
unsigned int  level 
)

Definition at line 329 of file osdMutex.c.

330 {
331  printf("ownerTid %p count %d owned %d\n",
332  (void *)pmutex->ownerTid, pmutex->count, pmutex->owned);
333 }
pthread_t ownerTid
Definition: osdMutex.c:172
#define printf
Definition: epicsStdio.h:41
epicsMutexLockStatus epicsMutexOsdTryLock ( struct epicsMutexOSD pmutex)

Definition at line 301 of file osdMutex.c.

302 {
303  pthread_t tid = pthread_self();
305  int status;
306 
307  status = mutexLock(&pmutex->lock);
308  if (status == EINVAL) return epicsMutexLockError;
309  checkStatus(status, "pthread_mutex_lock epicsMutexOsdTryLock");
310  if(status)
311  return epicsMutexLockError;
312 
313  if (!pmutex->owned || pthread_equal(pmutex->ownerTid, tid)) {
314  pmutex->ownerTid = tid;
315  pmutex->owned = 1;
316  pmutex->count++;
317  result = epicsMutexLockOK;
318  } else {
319  result = epicsMutexLockTimeout;
320  }
321 
322  status = pthread_mutex_unlock(&pmutex->lock);
323  checkStatus(status, "pthread_mutex_unlock epicsMutexOsdTryLock");
324  if(status)
325  return epicsMutexLockError;
326  return result;
327 }
pvac::PutEvent result
Definition: clientSync.cpp:117
pvd::Status status
pthread_mutex_t lock
Definition: osdMutex.c:164
pthread_t ownerTid
Definition: osdMutex.c:172
#define checkStatus(status, message)
Definition: osdMutex.c:29
epicsMutexLockStatus
Definition: epicsMutex.h:51
void epicsMutexOsdUnlock ( struct epicsMutexOSD pmutex)

Definition at line 237 of file osdMutex.c.

238 {
239  int status;
240 
241  status = mutexLock(&pmutex->lock);
242  checkStatus(status, "pthread_mutex_lock epicsMutexOsdUnlock");
243  if(status)
244  return;
245 
246  if ((pmutex->count <= 0) || (pmutex->ownerTid != pthread_self())) {
247  pthread_mutex_unlock(&pmutex->lock);
248  checkStatus(status, "pthread_mutex_unlock epicsMutexOsdUnlock");
249  errlogPrintf("epicsMutexOsdUnlock but caller is not owner\n");
250  cantProceed("epicsMutexOsdUnlock but caller is not owner");
251  return;
252  }
253 
254  pmutex->count--;
255  if (pmutex->count == 0) {
256  pmutex->owned = 0;
257  pmutex->ownerTid = 0;
258  status = pthread_cond_signal(&pmutex->waitToBeOwner);
259  checkStatusQuit(status, "pthread_cond_signal epicsMutexOsdUnlock", "epicsMutexOsdUnlock");
260  }
261 
262  status = pthread_mutex_unlock(&pmutex->lock);
263  checkStatus(status, "pthread_mutex_unlock epicsMutexOsdUnlock");
264 }
pvd::Status status
pthread_mutex_t lock
Definition: osdMutex.c:164
pthread_t ownerTid
Definition: osdMutex.c:172
#define checkStatus(status, message)
Definition: osdMutex.c:29
#define checkStatusQuit(status, message, method)
Definition: osdMutex.c:34
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54
pthread_cond_t waitToBeOwner
Definition: osdMutex.c:166