File indexing completed on 2025-05-11 08:24:26
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/score/coremsgimpl.h>
0043 #include <rtems/score/assert.h>
0044
0045 #define MESSAGE_SIZE_LIMIT \
0046 ( SIZE_MAX - sizeof( uintptr_t ) + 1 - sizeof( CORE_message_queue_Buffer ) )
0047
0048 RTEMS_STATIC_ASSERT(
0049 offsetof( CORE_message_queue_Buffer, buffer )
0050 == sizeof( CORE_message_queue_Buffer ),
0051 CORE_MESSAGE_QUEUE_BUFFER_OFFSET
0052 );
0053
0054 Status_Control _CORE_message_queue_Initialize(
0055 CORE_message_queue_Control *the_message_queue,
0056 CORE_message_queue_Disciplines discipline,
0057 uint32_t maximum_pending_messages,
0058 size_t maximum_message_size,
0059 CORE_message_queue_Allocate_buffers allocate_buffers,
0060 const void *arg
0061 )
0062 {
0063 size_t buffer_size;
0064
0065
0066 if ( maximum_message_size > MESSAGE_SIZE_LIMIT ) {
0067 return STATUS_MESSAGE_QUEUE_INVALID_SIZE;
0068 }
0069
0070 buffer_size = RTEMS_ALIGN_UP( maximum_message_size, sizeof( uintptr_t ) );
0071 _Assert( buffer_size >= maximum_message_size );
0072
0073 buffer_size += sizeof( CORE_message_queue_Buffer );
0074 _Assert( buffer_size >= sizeof( CORE_message_queue_Buffer ) );
0075
0076
0077 if ( maximum_pending_messages > SIZE_MAX / buffer_size ) {
0078 return STATUS_MESSAGE_QUEUE_INVALID_NUMBER;
0079 }
0080
0081 the_message_queue->message_buffers = ( *allocate_buffers )(
0082 the_message_queue,
0083 (size_t) maximum_pending_messages * buffer_size,
0084 arg
0085 );
0086
0087 if ( the_message_queue->message_buffers == NULL ) {
0088 return STATUS_MESSAGE_QUEUE_NO_MEMORY;
0089 }
0090
0091 the_message_queue->maximum_pending_messages = maximum_pending_messages;
0092 the_message_queue->number_of_pending_messages = 0;
0093 the_message_queue->maximum_message_size = maximum_message_size;
0094
0095 _CORE_message_queue_Set_notify( the_message_queue, NULL );
0096 _Chain_Initialize_empty( &the_message_queue->Pending_messages );
0097 _Thread_queue_Object_initialize( &the_message_queue->Wait_queue );
0098
0099 if ( discipline == CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY ) {
0100 the_message_queue->operations = &_Thread_queue_Operations_priority;
0101 } else {
0102 the_message_queue->operations = &_Thread_queue_Operations_FIFO;
0103 }
0104
0105 _Chain_Initialize (
0106 &the_message_queue->Inactive_messages,
0107 the_message_queue->message_buffers,
0108 (size_t) maximum_pending_messages,
0109 buffer_size
0110 );
0111
0112 return STATUS_SUCCESSFUL;
0113 }