This is Unofficial EPICS BASE Doxygen Site
epicsEvent.h File Reference

APIs for the epicsEvent binary semaphore. More...

#include "libComAPI.h"
#include "osdEvent.h"
+ Include dependency graph for epicsEvent.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define epicsEventWaitStatus   epicsEventStatus
 Old name provided for backwards compatibility. More...
 
#define epicsEventWaitOK   epicsEventOK
 Old name provided for backwards compatibility. More...
 
#define epicsEventWaitError   epicsEventError
 Old name provided for backwards compatibility. More...
 
#define epicsEventSignal(ID)   epicsEventMustTrigger(ID)
 A synonym for epicsEventTrigger(). More...
 

Typedefs

typedef struct epicsEventOSDepicsEventId
 An identifier for an epicsEvent for use with the C API. More...
 

Enumerations

enum  epicsEventStatus { epicsEventOK = 0, epicsEventWaitTimeout, epicsEventError }
 Return status from several C API routines. More...
 
enum  epicsEventInitialState { epicsEventEmpty, epicsEventFull }
 Possible initial states of a new epicsEvent. More...
 

Functions

LIBCOM_API epicsEventId epicsEventCreate (epicsEventInitialState initialState)
 Create an epicsEvent for use from C code, or return NULL. More...
 
LIBCOM_API epicsEventId epicsEventMustCreate (epicsEventInitialState initialState)
 Create an epicsEvent for use from C code. More...
 
LIBCOM_API void epicsEventDestroy (epicsEventId id)
 Destroy an epicsEvent and any resources it holds. More...
 
LIBCOM_API epicsEventStatus epicsEventTrigger (epicsEventId id)
 Trigger an event i.e. ensures the next or current call to wait completes. More...
 
LIBCOM_API void epicsEventMustTrigger (epicsEventId id)
 Trigger an event. More...
 
LIBCOM_API epicsEventStatus epicsEventWait (epicsEventId id)
 Wait for an event. More...
 
LIBCOM_API void epicsEventMustWait (epicsEventId id)
 Wait for an event (see epicsEventWait()). More...
 
LIBCOM_API epicsEventStatus epicsEventWaitWithTimeout (epicsEventId id, double timeOut)
 Wait an the event or until the specified timeout period is over. More...
 
LIBCOM_API epicsEventStatus epicsEventTryWait (epicsEventId id)
 Similar to wait() except that if the event is currenly empty the call will return immediately with status epicsEventWaitTimeout. More...
 
LIBCOM_API void epicsEventShow (epicsEventId id, unsigned int level)
 Display information about the semaphore. More...
 

Detailed Description

APIs for the epicsEvent binary semaphore.

Defines the C++ and C API's for a simple binary semaphore. If multiple threads are waiting on the same event, only one of them will be woken when the event is signalled.

The primary use of an event semaphore is for thread synchronization. An example of using an event semaphore is a consumer thread that processes requests from one or more producer threads. For example:

When creating the consumer thread also create an epicsEvent.

epicsEvent event;

The consumer thread has code containing:

while(1) {
pevent.wait();
while( {more work} ) {
{process work}
}
}

Producers create requests and issue the statement:

pevent.trigger();

Definition in file epicsEvent.h.

Macro Definition Documentation

#define epicsEventSignal (   ID)    epicsEventMustTrigger(ID)

A synonym for epicsEventTrigger().

Parameters
IDThe event identifier.
Returns
Status indicator.

Definition at line 172 of file epicsEvent.h.

#define epicsEventWaitError   epicsEventError

Old name provided for backwards compatibility.

Definition at line 60 of file epicsEvent.h.

#define epicsEventWaitOK   epicsEventOK

Old name provided for backwards compatibility.

Definition at line 58 of file epicsEvent.h.

#define epicsEventWaitStatus   epicsEventStatus

Old name provided for backwards compatibility.

Definition at line 56 of file epicsEvent.h.

Typedef Documentation

typedef struct epicsEventOSD* epicsEventId

An identifier for an epicsEvent for use with the C API.

Definition at line 46 of file epicsEvent.h.

Enumeration Type Documentation

Possible initial states of a new epicsEvent.

Enumerator
epicsEventEmpty 
epicsEventFull 

Definition at line 63 of file epicsEvent.h.

63  {
epicsEventInitialState
Possible initial states of a new epicsEvent.
Definition: epicsEvent.h:63

Return status from several C API routines.

Enumerator
epicsEventOK 
epicsEventWaitTimeout 
epicsEventError 

Definition at line 49 of file epicsEvent.h.

49  {
50  epicsEventOK = 0,
epicsEventStatus
Return status from several C API routines.
Definition: epicsEvent.h:49

Function Documentation

LIBCOM_API epicsEventId epicsEventCreate ( epicsEventInitialState  initialState)

Create an epicsEvent for use from C code, or return NULL.

Parameters
initialStateStarting state, epicsEventEmpty or epicsEventFull.
Returns
An identifier for the new event, or NULL if one not be created.

Definition at line 47 of file osdEvent.c.

48 {
49  epicsEventId pevent = malloc(sizeof(*pevent));
50 
51  if (pevent) {
52  int status = pthread_mutex_init(&pevent->mutex, 0);
53 
54  pevent->isFull = (init == epicsEventFull);
55  if (status) {
56  printStatus(status, "pthread_mutex_init", "epicsEventCreate");
57  } else {
58  status = pthread_cond_init(&pevent->cond, 0);
59  if (!status)
60  return pevent;
61  printStatus(status, "pthread_cond_init", "epicsEventCreate");
62  status = pthread_mutex_destroy(&pevent->mutex);
63  checkStatus(status, "pthread_mutex_destroy", "epicsEventCreate");
64  }
65  free(pevent);
66  }
67  return NULL;
68 }
pvd::Status status
pthread_cond_t cond
Definition: osdEvent.c:28
#define NULL
Definition: catime.c:38
#define checkStatus(status, routine, func)
Definition: osdEvent.c:35
#define printStatus(status, routine, func)
Definition: osdEvent.c:32
pthread_mutex_t mutex
Definition: osdEvent.c:27
LIBCOM_API void epicsEventDestroy ( epicsEventId  id)

Destroy an epicsEvent and any resources it holds.

No calls to any epicsEventWait routines can be active when this call is made.

Parameters
idThe event identifier.

Definition at line 70 of file osdEvent.c.

71 {
72  int status = pthread_mutex_destroy(&pevent->mutex);
73 
74  checkStatus(status, "pthread_mutex_destroy", "epicsEventDestroy");
75  status = pthread_cond_destroy(&pevent->cond);
76  checkStatus(status, "pthread_cond_destroy", "epicsEventDestroy");
77  free(pevent);
78 }
pvd::Status status
#define checkStatus(status, routine, func)
Definition: osdEvent.c:35
LIBCOM_API epicsEventId epicsEventMustCreate ( epicsEventInitialState  initialState)

Create an epicsEvent for use from C code.

This routine does not return if the object could not be created.

Parameters
initialStateStarting state, epicsEventEmpty or epicsEventFull.
Returns
An identifier for the new event.

Definition at line 106 of file epicsEvent.cpp.

108 {
109  epicsEventId id = epicsEventCreate (initialState);
110 
111  if (!id)
112  cantProceed ("epicsEventMustCreate");
113  return id;
114 }
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54
LIBCOM_API epicsEventId epicsEventCreate(epicsEventInitialState initialState)
Create an epicsEvent for use from C code, or return NULL.
Definition: osdEvent.c:47
LIBCOM_API void epicsEventMustTrigger ( epicsEventId  id)

Trigger an event.

This routine does not return if the identifier is invalid.

Parameters
idThe event identifier.

Definition at line 116 of file epicsEvent.cpp.

116  {
118 
119  if (status != epicsEventOK)
120  cantProceed ("epicsEventMustTrigger");
121 }
pvd::Status status
#define epicsEventTrigger(ID)
Definition: osdEvent.h:16
epicsEventStatus
Return status from several C API routines.
Definition: epicsEvent.h:49
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54
LIBCOM_API void epicsEventMustWait ( epicsEventId  id)

Wait for an event (see epicsEventWait()).

This routine does not return if the identifier is invalid.

Parameters
idThe event identifier.

Definition at line 123 of file epicsEvent.cpp.

123  {
125 
126  if (status != epicsEventOK)
127  cantProceed ("epicsEventMustWait");
128 }
pvd::Status status
#define epicsEventWait(ID)
Definition: osdEvent.h:19
epicsEventStatus
Return status from several C API routines.
Definition: epicsEvent.h:49
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54
LIBCOM_API void epicsEventShow ( epicsEventId  id,
unsigned int  level 
)

Display information about the semaphore.

Note
The information displayed is architecture dependant.
Parameters
idThe event identifier.
levelAn unsigned int for the level of information to be displayed.

Definition at line 150 of file osdEvent.c.

151 {
152  printf("epicsEvent %p: %s\n", pevent,
153  pevent->isFull ? "full" : "empty");
154  if (level > 0)
155  printf(" pthread_mutex = %p, pthread_cond = %p\n",
156  &pevent->mutex, &pevent->cond);
157 }
#define printf
Definition: epicsStdio.h:41
LIBCOM_API epicsEventStatus epicsEventTrigger ( epicsEventId  id)

Trigger an event i.e. ensures the next or current call to wait completes.

Note
This method may be called from a VxWorks or RTEMS interrupt handler.
Parameters
idThe event identifier.
Returns
Status indicator.

Definition at line 80 of file osdEvent.c.

81 {
82  int status = pthread_mutex_lock(&pevent->mutex);
83 
84  checkStatusReturn(status, "pthread_mutex_lock", "epicsEventTrigger");
85  if (!pevent->isFull) {
86  pevent->isFull = 1;
87  status = pthread_cond_signal(&pevent->cond);
88  checkStatus(status, "pthread_cond_signal", "epicsEventTrigger");
89  }
90  status = pthread_mutex_unlock(&pevent->mutex);
91  checkStatusReturn(status, "pthread_mutex_unlock", "epicsEventTrigger");
92  return epicsEventOK;
93 }
pvd::Status status
#define checkStatusReturn(status, routine, func)
Definition: osdEvent.c:40
#define checkStatus(status, routine, func)
Definition: osdEvent.c:35
LIBCOM_API epicsEventStatus epicsEventTryWait ( epicsEventId  id)

Similar to wait() except that if the event is currenly empty the call will return immediately with status epicsEventWaitTimeout.

Parameters
idThe event identifier.
Returns
Status indicator, epicsEventWaitTimeout when the event is empty.

Definition at line 145 of file osdEvent.c.

146 {
147  return epicsEventWaitWithTimeout(id, 0.0);
148 }
LIBCOM_API epicsEventStatus epicsEventWaitWithTimeout(epicsEventId pevent, double timeout)
Wait an the event or until the specified timeout period is over.
Definition: osdEvent.c:117
LIBCOM_API epicsEventStatus epicsEventWait ( epicsEventId  id)

Wait for an event.

Note
Blocks until full.
Parameters
idThe event identifier.
Returns
Status indicator.

Definition at line 95 of file osdEvent.c.

96 {
98  int status = pthread_mutex_lock(&pevent->mutex);
99 
100  checkStatusReturn(status, "pthread_mutex_lock", "epicsEventWait");
101  while (!pevent->isFull) {
102  status = pthread_cond_wait(&pevent->cond, &pevent->mutex);
103  if (status) {
104  printStatus(status, "pthread_cond_wait", "epicsEventWait");
105  result = epicsEventError;
106  goto release;
107  }
108  }
109  pevent->isFull = 0;
110  result = epicsEventOK;
111 release:
112  status = pthread_mutex_unlock(&pevent->mutex);
113  checkStatusReturn(status, "pthread_mutex_unlock", "epicsEventWait");
114  return result;
115 }
pvac::PutEvent result
Definition: clientSync.cpp:117
pvd::Status status
#define checkStatusReturn(status, routine, func)
Definition: osdEvent.c:40
#define printStatus(status, routine, func)
Definition: osdEvent.c:32
epicsEventStatus
Return status from several C API routines.
Definition: epicsEvent.h:49
LIBCOM_API epicsEventStatus epicsEventWaitWithTimeout ( epicsEventId  id,
double  timeOut 
)

Wait an the event or until the specified timeout period is over.

Note
Blocks until full or timeout.
Parameters
idThe event identifier.
timeOutThe timeout delay in seconds.
Returns
Status indicator.

Definition at line 117 of file osdEvent.c.

119 {
121  int status = pthread_mutex_lock(&pevent->mutex);
122 
123  checkStatusReturn(status, "pthread_mutex_lock", "epicsEventWaitWithTimeout");
124  if (!pevent->isFull) {
125  struct timespec wakeTime;
126 
127  convertDoubleToWakeTime(timeout, &wakeTime);
128  while (!status && !pevent->isFull) {
129  status = pthread_cond_timedwait(&pevent->cond, &pevent->mutex,
130  &wakeTime);
131  }
132  if (status) {
133  result = (status == ETIMEDOUT) ?
135  goto release;
136  }
137  }
138  pevent->isFull = 0;
139 release:
140  status = pthread_mutex_unlock(&pevent->mutex);
141  checkStatusReturn(status, "pthread_mutex_unlock", "epicsEventWaitWithTimeout");
142  return result;
143 }
double timeout
Definition: pvutils.cpp:25
pvac::PutEvent result
Definition: clientSync.cpp:117
pvd::Status status
LIBCOM_API void convertDoubleToWakeTime(double timeout, struct timespec *wakeTime)
Definition: osdTime.cpp:68
#define checkStatusReturn(status, routine, func)
Definition: osdEvent.c:40
epicsEventStatus
Return status from several C API routines.
Definition: epicsEvent.h:49
Defined by POSIX Real Time.
Definition: osdTime.h:21