This is Unofficial EPICS BASE Doxygen Site
osdSpin.c
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2012 Helmholtz-Zentrum Berlin
3 * fuer Materialien und Energie GmbH.
4 * Copyright (c) 2012 ITER Organization.
5 * EPICS BASE is distributed subject to a Software License Agreement found
6 * in file LICENSE that is included with this distribution.
7 \*************************************************************************/
8 
9 /*
10  * Author: Ralph Lange <Ralph.Lange@gmx.de>
11  */
12 
13 #include <stdlib.h>
14 
15 #include "cantProceed.h"
16 #include "errlog.h"
17 #include "epicsMutex.h"
18 #include "epicsSpin.h"
19 
20 /*
21  * Default: EPICS MUTEX IMPLEMENTATION
22  */
23 
24 typedef struct epicsSpin {
26 } epicsSpin;
27 
29  epicsSpin *spin;
30 
31  spin = calloc(1, sizeof(*spin));
32  if (!spin)
33  goto fail;
34 
35  spin->lock = epicsMutexCreate();
36  if (!spin->lock)
37  goto fail;
38 
39  return spin;
40 
41 fail:
42  free(spin);
43  return NULL;
44 }
45 
47 {
49  if(!ret)
50  cantProceed("epicsSpinMustCreate: epicsSpinCreate failed.");
51  return ret;
52 }
53 
55  epicsMutexDestroy(spin->lock);
56  free(spin);
57 }
58 
61 
62  status = epicsMutexLock(spin->lock);
63  if (status != epicsMutexLockOK) {
64  errlogPrintf("epicsSpinLock(%p): epicsMutexLock returned %s\n", spin,
65  status == epicsMutexLockTimeout ?
66  "epicsMutexLockTimeout" : "epicsMutexLockError");
67  }
68 }
69 
72 
73  status = epicsMutexTryLock(spin->lock);
74  if (status == epicsMutexLockOK) return 0;
75  if (status == epicsMutexLockTimeout) return 1;
76 
77  errlogPrintf("epicsSpinTryLock(%p): epicsMutexTryLock returned epicsMutexLockError\n", spin);
78  return 2;
79 }
80 
82  epicsMutexUnlock(spin->lock);
83 }
void epicsStdCall epicsMutexDestroy(epicsMutexId pmutexNode)
Destroy an epicsMutex semaphore.
Definition: epicsMutex.cpp:127
pvd::Status status
#define NULL
Definition: catime.c:38
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
void epicsSpinLock(epicsSpinId spin)
Definition: osdSpin.c:59
APIs for the epicsMutex mutual exclusion semaphore.
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
int epicsSpinTryLock(epicsSpinId spin)
Definition: osdSpin.c:70
void epicsSpinDestroy(epicsSpinId spin)
Definition: osdSpin.c:54
void epicsSpinUnlock(epicsSpinId spin)
Definition: osdSpin.c:81
epicsMutexLockStatus
Definition: epicsMutex.h:51
epicsMutexLockStatus epicsStdCall epicsMutexLock(epicsMutexId pmutexNode)
Claim the semaphore, waiting until it&#39;s free if currently owned owned by a different thread...
Definition: epicsMutex.cpp:145
epicsMutexLockStatus epicsStdCall epicsMutexTryLock(epicsMutexId pmutexNode)
Similar to epicsMutexLock() except that the call returns immediately, with the return status indicati...
Definition: epicsMutex.cpp:158
#define epicsMutexCreate()
Create an epicsMutex semaphore for use from C code.
Definition: epicsMutex.h:168
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54
Routines for code that can&#39;t continue or return after an error.
epicsSpinId epicsSpinMustCreate(void)
Definition: osdSpin.c:46
epicsSpinId epicsSpinCreate(void)
Definition: osdSpin.c:28
struct epicsSpin epicsSpin
epicsMutexId lock
Definition: osdSpin.c:25