File indexing completed on 2025-05-11 08:24:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041
0042 #include <rtems/rtems/messageimpl.h>
0043 #include <rtems/rtems/optionsimpl.h>
0044 #include <rtems/rtems/statusimpl.h>
0045
0046 THREAD_QUEUE_OBJECT_ASSERT(
0047 Message_queue_Control,
0048 message_queue.Wait_queue,
0049 MESSAGE_QUEUE_CONTROL
0050 );
0051
0052 rtems_status_code rtems_message_queue_receive(
0053 rtems_id id,
0054 void *buffer,
0055 size_t *size,
0056 rtems_option option_set,
0057 rtems_interval timeout
0058 )
0059 {
0060 Message_queue_Control *the_message_queue;
0061 Thread_queue_Context queue_context;
0062 Thread_Control *executing;
0063 Status_Control status;
0064
0065 if ( buffer == NULL ) {
0066 return RTEMS_INVALID_ADDRESS;
0067 }
0068
0069 if ( size == NULL ) {
0070 return RTEMS_INVALID_ADDRESS;
0071 }
0072
0073 the_message_queue = _Message_queue_Get( id, &queue_context );
0074
0075 if ( the_message_queue == NULL ) {
0076 #if defined(RTEMS_MULTIPROCESSING)
0077 return _Message_queue_MP_Receive( id, buffer, size, option_set, timeout );
0078 #else
0079 return RTEMS_INVALID_ID;
0080 #endif
0081 }
0082
0083 _CORE_message_queue_Acquire_critical(
0084 &the_message_queue->message_queue,
0085 &queue_context
0086 );
0087
0088 executing = _Thread_Executing;
0089 _Thread_queue_Context_set_enqueue_timeout_ticks( &queue_context, timeout );
0090 status = _CORE_message_queue_Seize(
0091 &the_message_queue->message_queue,
0092 executing,
0093 buffer,
0094 size,
0095 !_Options_Is_no_wait( option_set ),
0096 &queue_context
0097 );
0098 return _Status_Get( status );
0099 }