This is Unofficial EPICS BASE Doxygen Site
osdEvent.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 "epicsEvent.h"
#include "epicsTime.h"
#include "errlog.h"
+ Include dependency graph for osdEvent.c:

Go to the source code of this file.

Classes

struct  epicsEventOSD
 

Macros

#define printStatus(status, routine, func)   errlogPrintf("%s: %s failed: %s\n", (func), (routine), strerror(status))
 
#define checkStatus(status, routine, func)
 
#define checkStatusReturn(status, routine, func)
 

Functions

LIBCOM_API epicsEventId epicsEventCreate (epicsEventInitialState init)
 Create an epicsEvent for use from C code, or return NULL. More...
 
LIBCOM_API void epicsEventDestroy (epicsEventId pevent)
 Destroy an epicsEvent and any resources it holds. More...
 
LIBCOM_API epicsEventStatus epicsEventTrigger (epicsEventId pevent)
 Trigger an event i.e. ensures the next or current call to wait completes. More...
 
LIBCOM_API epicsEventStatus epicsEventWait (epicsEventId pevent)
 Wait for an event. More...
 
LIBCOM_API epicsEventStatus epicsEventWaitWithTimeout (epicsEventId pevent, 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 pevent, unsigned int level)
 Display information about the semaphore. More...
 

Macro Definition Documentation

#define checkStatus (   status,
  routine,
  func 
)
Value:
if (status) { \
printStatus(status, routine, func); \
}
pvd::Status status
#define printStatus(status, routine, func)
Definition: osdEvent.c:32

Definition at line 35 of file osdEvent.c.

#define checkStatusReturn (   status,
  routine,
  func 
)
Value:
if (status) { \
printStatus(status, routine, func); \
return epicsEventError; \
}
pvd::Status status
#define printStatus(status, routine, func)
Definition: osdEvent.c:32

Definition at line 40 of file osdEvent.c.

#define printStatus (   status,
  routine,
  func 
)    errlogPrintf("%s: %s failed: %s\n", (func), (routine), strerror(status))

Definition at line 32 of file osdEvent.c.

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
pthread_cond_t cond
Definition: osdEvent.c:28
#define checkStatus(status, routine, func)
Definition: osdEvent.c:35
pthread_mutex_t mutex
Definition: osdEvent.c:27
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
pthread_cond_t cond
Definition: osdEvent.c:28
pthread_mutex_t mutex
Definition: osdEvent.c:27
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
pthread_cond_t cond
Definition: osdEvent.c:28
#define checkStatusReturn(status, routine, func)
Definition: osdEvent.c:40
#define checkStatus(status, routine, func)
Definition: osdEvent.c:35
pthread_mutex_t mutex
Definition: osdEvent.c:27
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
pthread_cond_t cond
Definition: osdEvent.c:28
#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
pthread_mutex_t mutex
Definition: osdEvent.c:27
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
pthread_cond_t cond
Definition: osdEvent.c:28
#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
pthread_mutex_t mutex
Definition: osdEvent.c:27