19 #define __RTEMS_VIOLATE_KERNEL_VISIBILITY__ 1 23 #include <rtems/error.h> 33 #ifdef EPICS_RTEMS_SEMAPHORE_STATS 34 unsigned long semEstat[4];
35 #define SEMSTAT(i) semEstat[i]++; 48 rtems_interrupt_level level;
53 sc = rtems_semaphore_create (rtems_build_name (
'B', c3, c2, c1),
55 RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE |
56 RTEMS_NO_INHERIT_PRIORITY | RTEMS_NO_PRIORITY_CEILING | RTEMS_LOCAL,
59 if (sc != RTEMS_SUCCESSFUL) {
60 errlogPrintf (
"Can't create binary semaphore: %s\n", rtems_status_text (sc));
63 rtems_interrupt_disable (level);
82 rtems_interrupt_enable (level);
89 rtems_id sid = (rtems_id)
id;
92 sc = rtems_semaphore_delete (sid);
93 if (sc != RTEMS_SUCCESSFUL)
94 errlogPrintf (
"Can't destroy semaphore: %s\n", rtems_status_text (sc));
100 rtems_id sid = (rtems_id)
id;
101 rtems_status_code sc;
103 sc = rtems_semaphore_release (sid);
104 if (sc == RTEMS_SUCCESSFUL)
106 errlogPrintf (
"Can't release semaphore: %s\n", rtems_status_text (sc));
113 rtems_id sid = (rtems_id)
id;
114 rtems_status_code sc;
117 sc = rtems_semaphore_obtain (sid, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
118 if (sc != RTEMS_SUCCESSFUL)
126 rtems_id sid = (rtems_id)
id;
127 rtems_status_code sc;
128 rtems_interval delay;
137 sc = rtems_semaphore_obtain (sid, RTEMS_WAIT, delay);
138 if (sc == RTEMS_SUCCESSFUL)
140 else if (sc == RTEMS_TIMEOUT)
149 rtems_id sid = (rtems_id)
id;
150 rtems_status_code sc;
153 sc = rtems_semaphore_obtain (sid, RTEMS_NO_WAIT, RTEMS_NO_TIMEOUT);
154 if (sc == RTEMS_SUCCESSFUL)
156 else if (sc == RTEMS_UNSATISFIED)
165 #if __RTEMS_VIOLATE_KERNEL_VISIBILITY__ 166 rtems_id sid = (rtems_id)
id;
167 Semaphore_Control *the_semaphore;
168 Semaphore_Control semaphore;
169 Objects_Locations location;
171 the_semaphore = _Semaphore_Get (sid, &location);
172 if (location != OBJECTS_LOCAL)
179 semaphore = *the_semaphore;
180 _Thread_Enable_dispatch();
181 printf (
" %8.8x ", (
int)sid);
182 if (_Attributes_Is_counting_semaphore (semaphore.attribute_set)) {
183 printf (
"Count: %d", (
int)semaphore.Core_control.semaphore.count);
186 if (_CORE_mutex_Is_locked(&semaphore.Core_control.mutex)) {
189 printf (
"Held by:%8.8x (%s) Nest count:%d",
190 (
unsigned int)semaphore.Core_control.mutex.holder_id,
192 (
int)semaphore.Core_control.mutex.nest_count);
LIBCOM_API epicsEventStatus epicsEventWaitWithTimeout(epicsEventId pevent, double timeout)
Wait an the event or until the specified timeout period is over.
LIBCOM_API epicsEventStatus epicsEventTrigger(epicsEventId pevent)
Trigger an event i.e. ensures the next or current call to wait completes.
LIBCOM_API epicsEventId epicsEventCreate(epicsEventInitialState init)
Create an epicsEvent for use from C code, or return NULL.
double rtemsTicksPerSecond_double
LIBCOM_API void epicsEventShow(epicsEventId pevent, unsigned int level)
Display information about the semaphore.
LIBCOM_API epicsEventStatus epicsEventTryWait(epicsEventId id)
Similar to wait() except that if the event is currenly empty the call will return immediately with st...
LIBCOM_API void epicsStdCall epicsThreadGetName(epicsThreadId id, char *name, size_t size)
int errlogPrintf(const char *pFormat,...)
APIs for the epicsEvent binary semaphore.
epicsEventStatus
Return status from several C API routines.
epicsEventInitialState
Possible initial states of a new epicsEvent.
LIBCOM_API epicsEventStatus epicsEventWait(epicsEventId pevent)
Wait for an event.
C++ and C descriptions for a thread.
LIBCOM_API void epicsEventDestroy(epicsEventId pevent)
Destroy an epicsEvent and any resources it holds.