20 #define __RTEMS_VIOLATE_KERNEL_VISIBILITY__ 1 27 #include <rtems/error.h> 36 rtems_interrupt_level level;
44 sc = rtems_message_queue_create (rtems_build_name (
'Q', c3, c2, c1),
47 RTEMS_FIFO|RTEMS_LOCAL,
49 if (sc != RTEMS_SUCCESSFUL) {
51 errlogPrintf (
"Can't create message queue: %s\n", rtems_status_text (sc));
54 id->maxSize = maximumMessageSize;
56 rtems_interrupt_disable (level);
75 rtems_interrupt_enable (level);
79 static rtems_status_code rtems_message_queue_send_timeout(
85 Message_queue_Control *the_message_queue;
86 Objects_Locations location;
87 CORE_message_queue_Status msg_status;
89 the_message_queue = _Message_queue_Get(
id, &location );
93 return RTEMS_INVALID_ID;
96 msg_status = _CORE_message_queue_Send(
97 &the_message_queue->message_queue,
106 _Thread_Enable_dispatch();
115 if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
116 msg_status = _Thread_Executing->Wait.return_code;
117 return _Message_queue_Translate_core_message_queue_return_code( msg_status );
119 return RTEMS_INTERNAL_ERROR;
125 unsigned int messageSize)
127 if (rtems_message_queue_send_timeout(id->
id, message, messageSize, RTEMS_NO_TIMEOUT) == RTEMS_SUCCESSFUL)
136 unsigned int messageSize,
139 rtems_interval delay;
147 delay = (int)(timeout * rtemsTicksPerSecond_double);
150 if (rtems_message_queue_send_timeout(id->
id, message, messageSize, delay) == RTEMS_SUCCESSFUL)
156 static int receiveMessage(
161 rtems_interval delay)
164 rtems_status_code sc;
166 if (size < id->maxSize) {
168 id->localBuf = malloc(id->
maxSize);
175 memcpy(buffer, id->
localBuf, rsize);
178 sc = rtems_message_queue_receive(id->
id, buffer, &rsize, wait, delay);
179 if (sc != RTEMS_SUCCESSFUL)
190 return receiveMessage(
id, message, size, RTEMS_NO_WAIT, 0);
198 return receiveMessage(
id, message, size, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
207 rtems_interval delay;
214 if (timeout <= 0.0) {
215 wait = RTEMS_NO_WAIT;
220 delay = (int)(timeout * rtemsTicksPerSecond_double);
224 return receiveMessage(
id, message, size, wait, delay);
231 rtems_status_code sc;
233 sc = rtems_message_queue_get_number_pending(id->
id, &count);
234 if (sc != RTEMS_SUCCESSFUL) {
235 errlogPrintf(
"Message queue %x get number pending failed: %s\n",
237 rtems_status_text(sc));
249 printf (
"Message queue %lx -- Pending: %d\n", (
unsigned long)
id, pending);
LIBCOM_API int epicsStdCall epicsMessageQueueTryReceive(epicsMessageQueueId id, void *message, unsigned int size)
Try to receive a message.
LIBCOM_API void epicsStdCall epicsMessageQueueShow(epicsMessageQueueId id, int level)
Displays some information about the message queue.
LIBCOM_API int epicsStdCall epicsMessageQueueReceiveWithTimeout(epicsMessageQueueId id, void *message, unsigned int size, double timeout)
Wait for a message to be queued.
#define epicsMessageQueueTrySend(q, m, l)
LIBCOM_API int epicsStdCall epicsMessageQueueReceive(epicsMessageQueueId id, void *message, unsigned int size)
Fetch the next message on the queue.
LIBCOM_API int epicsStdCall epicsMessageQueueSend(epicsMessageQueueId id, void *message, unsigned int messageSize)
Send a message.
double rtemsTicksPerSecond_double
LIBCOM_API int epicsStdCall epicsMessageQueuePending(epicsMessageQueueId id)
How many messages are queued.
LIBCOM_API epicsMessageQueueId epicsStdCall epicsMessageQueueCreate(unsigned int capacity, unsigned int maximumMessageSize)
Create a message queue.
int errlogPrintf(const char *pFormat,...)
A C++ and a C facility for communication between threads.
LIBCOM_API int epicsStdCall epicsMessageQueueSendWithTimeout(epicsMessageQueueId id, void *message, unsigned int messageSize, double timeout)
Send a message or timeout.