70 unsigned int capacity,
71 unsigned int maxMessageSize)
74 unsigned int slotBytes, slotLongs;
85 slotLongs = 1 + ((maxMessageSize +
sizeof(
unsigned long) - 1) /
sizeof(
unsigned long));
86 slotBytes = slotLongs *
sizeof(
unsigned long);
89 pmsg->
buf = (
unsigned long*)calloc(pmsg->
capacity, slotBytes);
110 destroyEventNode(
struct eventNode *enode)
116 LIBCOM_API
void epicsStdCall
121 while ((evp = reinterpret_cast < struct eventNode * >
123 destroyEventNode(evp);
137 evp = (
struct eventNode *) calloc(1,
sizeof(*evp));
163 char *myInPtr, *nextPtr;
188 threadNode.
evp = getEventNode(pmsg);
190 if (!threadNode.
evp) {
215 freeEventNode(pmsg, threadNode.
evp, status);
227 if ((pthr = reinterpret_cast < struct threadNode * >
229 if(size <= pthr->
size)
230 memcpy(pthr->
buf, message, size);
241 myInPtr = (
char *)pmsg->
inPtr;
246 if (nextPtr == (
char *)pmsg->
outPtr)
248 *(
volatile unsigned long *)myInPtr =
size;
249 memcpy((
unsigned long *)myInPtr + 1, message,
size);
250 pmsg->
inPtr = nextPtr;
255 LIBCOM_API
int epicsStdCall
259 return mySend(pmsg, message, size, 0);
262 LIBCOM_API
int epicsStdCall
266 return mySend(pmsg, message, size, -1);
269 LIBCOM_API
int epicsStdCall
273 return mySend(pmsg, message, size, timeout);
289 myOutPtr = (
char *)pmsg->
outPtr;
292 l = *(
unsigned long *)myOutPtr;
294 memcpy(message, (
unsigned long *)myOutPtr + 1, l);
309 if ((pthr = reinterpret_cast < struct threadNode * >
331 threadNode.
evp = getEventNode(pmsg);
332 threadNode.
buf = message;
336 if (!threadNode.
evp) {
346 if ((pthr = reinterpret_cast < struct threadNode * >
367 freeEventNode(pmsg, threadNode.
evp, status);
372 return threadNode.
size;
376 LIBCOM_API
int epicsStdCall
380 return myReceive(pmsg, message, size, 0);
383 LIBCOM_API
int epicsStdCall
387 return myReceive(pmsg, message, size, -1);
390 LIBCOM_API
int epicsStdCall
394 return myReceive(pmsg, message, size, timeout);
397 LIBCOM_API
int epicsStdCall
400 char *myInPtr, *myOutPtr;
404 myInPtr = (
char *)pmsg->
inPtr;
405 myOutPtr = (
char *)pmsg->
outPtr;
408 else if (myInPtr >= myOutPtr)
409 nmsg = (myInPtr - myOutPtr) / pmsg->
slotSize;
416 LIBCOM_API
void epicsStdCall
419 printf(
"Message Queue Used:%d Slots:%lu",
LIBCOM_API int epicsStdCall epicsMessageQueueTryReceive(epicsMessageQueueId pmsg, void *message, unsigned int size)
Try to receive a message.
void epicsStdCall epicsMutexDestroy(epicsMutexId pmutexNode)
Destroy an epicsMutex semaphore.
An EPICS-specific replacement for ANSI C's assert.
LIBCOM_API int epicsStdCall epicsMessageQueueSendWithTimeout(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout)
Send a message or timeout.
LIBCOM_API int epicsStdCall epicsMessageQueueTrySend(epicsMessageQueueId pmsg, void *message, unsigned int size)
Try to send a message.
#define epicsEventWait(ID)
ELLNODE * ellGet(ELLLIST *pList)
Deletes and returns the first node from a list.
struct epicsMessageQueueOSD * epicsMessageQueueId
LIBCOM_API epicsEventStatus epicsEventWaitWithTimeout(epicsEventId id, double timeOut)
Wait an the event or until the specified timeout period is over.
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
A doubly-linked list library.
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
LIBCOM_API epicsMessageQueueId epicsStdCall epicsMessageQueueCreate(unsigned int capacity, unsigned int maxMessageSize)
Create a message queue.
#define epicsEventSignal(ID)
A synonym for epicsEventTrigger().
APIs for the epicsMutex mutual exclusion semaphore.
int numberOfSendersWaiting
LIBCOM_API void epicsEventDestroy(epicsEventId id)
Destroy an epicsEvent and any resources it holds.
LIBCOM_API void epicsStdCall epicsMessageQueueDestroy(epicsMessageQueueId pmsg)
Destroy a message queue, release all its memory.
APIs for the epicsEvent binary semaphore.
LIBCOM_API int epicsStdCall epicsMessageQueueReceive(epicsMessageQueueId pmsg, void *message, unsigned int size)
Fetch the next message on the queue.
unsigned long maxMessageSize
epicsEventStatus
Return status from several C API routines.
A C++ and a C facility for communication between threads.
#define ellInit(PLIST)
Initialize a list type.
#define epicsMutexCreate()
Create an epicsMutex semaphore for use from C code.
LIBCOM_API int epicsStdCall epicsMessageQueueSend(epicsMessageQueueId pmsg, void *message, unsigned int size)
Send a message.
LIBCOM_API int epicsStdCall epicsMessageQueueReceiveWithTimeout(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout)
Wait for a message to be queued.
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
void ellDelete(ELLLIST *pList, ELLNODE *pNode)
Deletes a node from a list.
LIBCOM_API epicsEventId epicsEventCreate(epicsEventInitialState initialState)
Create an epicsEvent for use from C code, or return NULL.
LIBCOM_API void epicsStdCall epicsMessageQueueShow(epicsMessageQueueId pmsg, int level)
Displays some information about the message queue.
LIBCOM_API int epicsStdCall epicsMessageQueuePending(epicsMessageQueueId pmsg)
How many messages are queued.
#define ellFirst(PLIST)
Find the first node in list.