This is Unofficial EPICS BASE Doxygen Site
epicsMutex.h
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2002 The University of Chicago, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE is distributed subject to a Software License Agreement found
7 * in file LICENSE that is included with this distribution.
8 \*************************************************************************/
9 
40 #ifndef epicsMutexh
41 #define epicsMutexh
42 
43 #include "epicsAssert.h"
44 
45 #include "libComAPI.h"
46 
48 typedef struct epicsMutexParm *epicsMutexId;
49 
51 typedef enum {
56 
57 #ifdef __cplusplus
58 
59 #include "compilerDependencies.h"
60 #include "epicsGuard.h"
61 
64 #define newEpicsMutex new epicsMutex(__FILE__,__LINE__)
65 
68 class LIBCOM_API epicsMutex {
69 public:
70  typedef epicsGuard<epicsMutex> guard_t;
71  typedef epicsGuard<epicsMutex> release_t;
72  class mutexCreateFailed; /* exception payload */
73  class invalidMutex; /* exception payload */
74 
75 #if !defined(__GNUC__) || __GNUC__<4 || (__GNUC__==4 && __GNUC_MINOR__<8)
76 
78  epicsMutex ();
79 
86  epicsMutex ( const char *pFileName, int lineno );
87 #else
88 
92  epicsMutex ( const char *pFileName = __builtin_FILE(), int lineno = __builtin_LINE() );
93 #endif
94 
97  ~epicsMutex ();
98 
105  void show ( unsigned level ) const;
106 
115  void lock ();
116 
122  void unlock ();
123 
130  bool tryLock ();
131 private:
132  epicsMutexId id;
133  epicsMutex ( const epicsMutex & );
134  epicsMutex & operator = ( const epicsMutex & );
135 };
136 
138 class LIBCOM_API epicsDeadlockDetectMutex {
139 public:
140  typedef epicsGuard<epicsDeadlockDetectMutex> guard_t;
141  typedef epicsGuard<epicsDeadlockDetectMutex> release_t;
142  typedef unsigned hierarchyLevel_t;
143  epicsDeadlockDetectMutex ( unsigned hierarchyLevel_t );
144  ~epicsDeadlockDetectMutex ();
145  void show ( unsigned level ) const;
146  void lock (); /* blocks until success */
147  void unlock ();
148  bool tryLock (); /* true if successful */
149 private:
151  const hierarchyLevel_t hierarchyLevel;
152  class epicsDeadlockDetectMutex * pPreviousLevel;
153  epicsDeadlockDetectMutex ( const epicsDeadlockDetectMutex & );
154  epicsDeadlockDetectMutex & operator = ( const epicsDeadlockDetectMutex & );
155 };
156 
157 #endif /*__cplusplus*/
158 
159 #ifdef __cplusplus
160 extern "C" {
161 #endif /*__cplusplus*/
162 
168 #define epicsMutexCreate() epicsMutexOsiCreate(__FILE__,__LINE__)
169 
170 LIBCOM_API epicsMutexId epicsStdCall epicsMutexOsiCreate(
171  const char *pFileName,int lineno);
172 
179 #define epicsMutexMustCreate() epicsMutexOsiMustCreate(__FILE__,__LINE__)
180 
181 LIBCOM_API epicsMutexId epicsStdCall epicsMutexOsiMustCreate(
182  const char *pFileName,int lineno);
183 
187 LIBCOM_API void epicsStdCall epicsMutexDestroy(epicsMutexId id);
188 
194 LIBCOM_API void epicsStdCall epicsMutexUnlock(epicsMutexId id);
195 
206 LIBCOM_API epicsMutexLockStatus epicsStdCall epicsMutexLock(
207  epicsMutexId id);
208 
214 #define epicsMutexMustLock(ID) { \
215  epicsMutexLockStatus status = epicsMutexLock(ID); \
216  assert(status == epicsMutexLockOK); \
217 }
218 
226 LIBCOM_API epicsMutexLockStatus epicsStdCall epicsMutexTryLock(
227  epicsMutexId id);
228 
236 LIBCOM_API void epicsStdCall epicsMutexShow(
237  epicsMutexId id,unsigned int level);
238 
246 LIBCOM_API void epicsStdCall epicsMutexShowAll(
247  int onlyLocked,unsigned int level);
248 
254 struct epicsMutexOSD * epicsMutexOsdCreate(void);
255 void epicsMutexOsdDestroy(struct epicsMutexOSD *);
256 void epicsMutexOsdUnlock(struct epicsMutexOSD *);
258 epicsMutexLockStatus epicsMutexOsdTryLock(struct epicsMutexOSD *);
259 void epicsMutexOsdShow(struct epicsMutexOSD *,unsigned int level);
260 
261 #ifdef __cplusplus
262 }
263 #endif
264 
265 #include "osdMutex.h"
266 
267 #endif /* epicsMutexh */
epicsMutexId lock
Definition: osiClockTime.c:37
An EPICS-specific replacement for ANSI C&#39;s assert.
int lineno
Definition: antelope.c:33
LIBCOM_API epicsMutexLockStatus epicsStdCall epicsMutexTryLock(epicsMutexId id)
Similar to epicsMutexLock() except that the call returns immediately, with the return status indicati...
Definition: epicsMutex.cpp:158
struct epicsMutexParm * epicsMutexId
An identifier for an epicsMutex for use with the C API.
Definition: epicsMutex.h:48
LIBCOM_API void epicsStdCall epicsMutexShow(epicsMutexId id, unsigned int level)
Display information about the semaphore.
Definition: epicsMutex.cpp:191
epicsMutex mutex
Definition: pvAccess.cpp:71
epicsMutexLockStatus
Definition: epicsMutex.h:51
LIBCOM_API void epicsStdCall epicsMutexShowAll(int onlyLocked, unsigned int level)
Display information about all epicsMutex semaphores.
Definition: epicsMutex.cpp:217
LIBCOM_API void epicsStdCall epicsMutexUnlock(epicsMutexId id)
Release the semaphore.
Definition: epicsMutex.cpp:140
#define epicsMutexOsdUnlock(ID)
Definition: osdMutex.h:22
#define epicsMutexOsdLock(ID)
Definition: osdMutex.h:24
LIBCOM_API epicsMutexId epicsStdCall epicsMutexOsiCreate(const char *pFileName, int lineno)
Internal API, used by epicsMutexCreate().
Definition: epicsMutex.cpp:85
Compiler specific declarations.
LIBCOM_API epicsMutexLockStatus epicsStdCall epicsMutexLock(epicsMutexId id)
Claim the semaphore, waiting until it&#39;s free if currently owned owned by a different thread...
Definition: epicsMutex.cpp:145
LIBCOM_API epicsMutexId epicsStdCall epicsMutexOsiMustCreate(const char *pFileName, int lineno)
Internal API, used by epicsMutexMustCreate().
Definition: epicsMutex.cpp:119
LIBCOM_API void epicsStdCall epicsMutexDestroy(epicsMutexId id)
Destroy an epicsMutex semaphore.
Definition: epicsMutex.cpp:127