diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2020-09-23 10:09:37 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2020-09-28 06:19:52 +0200 |
commit | 5bc7c3724fbb06d934401400ac5922bcae2c6e95 (patch) | |
tree | 7857429e00f8e495ed5ae3317c62e1a15458f374 | |
parent | 34dd90a560454842595845b95b7aed8b871d5da9 (diff) |
score: Improve _CORE_message_queue_Initialize()
Return a status code and differentiate between error conditions.
Update #4007.
-rw-r--r-- | cpukit/include/rtems/score/coremsgimpl.h | 29 | ||||
-rw-r--r-- | cpukit/include/rtems/score/status.h | 6 | ||||
-rw-r--r-- | cpukit/posix/src/mqueueopen.c | 17 | ||||
-rw-r--r-- | cpukit/rtems/src/msgqcreate.c | 17 | ||||
-rw-r--r-- | cpukit/score/src/coremsg.c | 10 | ||||
-rw-r--r-- | testsuites/sptests/sp77/init.c | 2 | ||||
-rw-r--r-- | testsuites/sptests/spmsgq_err01/init.c | 11 |
7 files changed, 52 insertions, 40 deletions
diff --git a/cpukit/include/rtems/score/coremsgimpl.h b/cpukit/include/rtems/score/coremsgimpl.h index e598dce96a..9403fb95fc 100644 --- a/cpukit/include/rtems/score/coremsgimpl.h +++ b/cpukit/include/rtems/score/coremsgimpl.h @@ -71,24 +71,25 @@ typedef int CORE_message_queue_Submit_types; /** * @brief Initializes a message queue. * - * This package is the implementation of the CORE Message Queue Handler. - * This core object provides task synchronization and communication functions - * via messages passed to queue objects. + * @param[out] the_message_queue is the message queue to initialize. + * + * @param discipline is the blocking discipline for the message queue. + * + * @param maximum_pending_messages is the maximum number of messages that will + * be allowed to be pending at any given time. + * + * @param maximum_message_size is the size of the largest message that may be + * sent to this message queue instance. * - * This routine initializes @a the_message_queue - * based on the parameters passed. + * @retval STATUS_SUCCESSFUL The message queue was initialized. * - * @param[out] the_message_queue The message queue to initialize. - * @param discipline The blocking discipline for the message queue. - * @param maximum_pending_messages The maximum number of messages - * that will be allowed to pend at any given time. - * @param maximum_message_size The size of the largest message that - * may be sent to this message queue instance. + * @retval STATUS_MESSAGE_QUEUE_INVALID_SIZE Calculations with the maximum + * pending messages or maximum message size produced an integer overflow. * - * @retval true The message queue can be initialized. - * @retval false Memory for the pending messages cannot be allocated. + * @retval STATUS_MESSAGE_QUEUE_NO_MEMORY There was not enough memory to + * allocate the message buffers. */ -bool _CORE_message_queue_Initialize( +Status_Control _CORE_message_queue_Initialize( CORE_message_queue_Control *the_message_queue, CORE_message_queue_Disciplines discipline, uint32_t maximum_pending_messages, diff --git a/cpukit/include/rtems/score/status.h b/cpukit/include/rtems/score/status.h index b257ccc5db..820ce5ffa1 100644 --- a/cpukit/include/rtems/score/status.h +++ b/cpukit/include/rtems/score/status.h @@ -91,6 +91,12 @@ typedef enum { STATUS_BUILD( STATUS_CLASSIC_INTERNAL_ERROR, EOVERFLOW ), STATUS_MESSAGE_INVALID_SIZE = STATUS_BUILD( STATUS_CLASSIC_INVALID_SIZE, EMSGSIZE ), + STATUS_MESSAGE_QUEUE_INVALID_NUMBER = + STATUS_BUILD( STATUS_CLASSIC_INVALID_NUMBER, ENOSPC ), + STATUS_MESSAGE_QUEUE_INVALID_SIZE = + STATUS_BUILD( STATUS_CLASSIC_INVALID_SIZE, ENOSPC ), + STATUS_MESSAGE_QUEUE_NO_MEMORY = + STATUS_BUILD( STATUS_CLASSIC_UNSATISFIED, ENOSPC ), STATUS_MESSAGE_QUEUE_WAIT_IN_ISR = STATUS_BUILD( STATUS_CLASSIC_INTERNAL_ERROR, EAGAIN ), STATUS_MESSAGE_QUEUE_WAS_DELETED = diff --git a/cpukit/posix/src/mqueueopen.c b/cpukit/posix/src/mqueueopen.c index 35b8c923b1..af8abebea8 100644 --- a/cpukit/posix/src/mqueueopen.c +++ b/cpukit/posix/src/mqueueopen.c @@ -60,6 +60,7 @@ static mqd_t _POSIX_Message_queue_Create( { POSIX_Message_queue_Control *the_mq; char *name; + Status_Control status; /* length of name has already been validated */ @@ -97,14 +98,14 @@ static mqd_t _POSIX_Message_queue_Create( * Joel: Cite POSIX or OpenGroup on above statement so we can determine * if it is a real requirement. */ - if ( - !_CORE_message_queue_Initialize( - &the_mq->Message_queue, - CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO, - attr->mq_maxmsg, - attr->mq_msgsize - ) - ) { + status = _CORE_message_queue_Initialize( + &the_mq->Message_queue, + CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO, + attr->mq_maxmsg, + attr->mq_msgsize + ); + + if ( status != STATUS_SUCCESSFUL ) { _POSIX_Message_queue_Free( the_mq ); _Workspace_Free( name ); rtems_set_errno_and_return_value( ENOSPC, MQ_OPEN_FAILED ); diff --git a/cpukit/rtems/src/msgqcreate.c b/cpukit/rtems/src/msgqcreate.c index 3741347cc9..79b198199e 100644 --- a/cpukit/rtems/src/msgqcreate.c +++ b/cpukit/rtems/src/msgqcreate.c @@ -41,6 +41,7 @@ rtems_status_code rtems_message_queue_create( { Message_queue_Control *the_message_queue; CORE_message_queue_Disciplines discipline; + Status_Control status; #if defined(RTEMS_MULTIPROCESSING) bool is_global; #endif @@ -107,12 +108,14 @@ rtems_status_code rtems_message_queue_create( else discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO; - if ( ! _CORE_message_queue_Initialize( - &the_message_queue->message_queue, - discipline, - count, - max_message_size - ) ) { + status = _CORE_message_queue_Initialize( + &the_message_queue->message_queue, + discipline, + count, + max_message_size + ); + + if ( status != STATUS_SUCCESSFUL ) { #if defined(RTEMS_MULTIPROCESSING) if ( is_global ) _Objects_MP_Close( @@ -121,7 +124,7 @@ rtems_status_code rtems_message_queue_create( _Message_queue_Free( the_message_queue ); _Objects_Allocator_unlock(); - return RTEMS_UNSATISFIED; + return STATUS_GET_CLASSIC( status ); } _Objects_Open( diff --git a/cpukit/score/src/coremsg.c b/cpukit/score/src/coremsg.c index 0246a3ae77..c86f2c28e2 100644 --- a/cpukit/score/src/coremsg.c +++ b/cpukit/score/src/coremsg.c @@ -26,7 +26,7 @@ ( SIZE_MAX - sizeof( uintptr_t ) + 1 \ - sizeof( CORE_message_queue_Buffer_control ) ) -bool _CORE_message_queue_Initialize( +Status_Control _CORE_message_queue_Initialize( CORE_message_queue_Control *the_message_queue, CORE_message_queue_Disciplines discipline, uint32_t maximum_pending_messages, @@ -37,7 +37,7 @@ bool _CORE_message_queue_Initialize( /* Make sure the message size computation does not overflow */ if ( maximum_message_size > MESSAGE_SIZE_LIMIT ) { - return false; + return STATUS_MESSAGE_QUEUE_INVALID_SIZE; } buffer_size = RTEMS_ALIGN_UP( maximum_message_size, sizeof( uintptr_t ) ); @@ -48,7 +48,7 @@ bool _CORE_message_queue_Initialize( /* Make sure the memory allocation size computation does not overflow */ if ( maximum_pending_messages > SIZE_MAX / buffer_size ) { - return false; + return STATUS_MESSAGE_QUEUE_INVALID_NUMBER; } the_message_queue->message_buffers = _Workspace_Allocate( @@ -56,7 +56,7 @@ bool _CORE_message_queue_Initialize( ); if ( the_message_queue->message_buffers == NULL ) { - return false; + return STATUS_MESSAGE_QUEUE_NO_MEMORY; } the_message_queue->maximum_pending_messages = maximum_pending_messages; @@ -80,5 +80,5 @@ bool _CORE_message_queue_Initialize( buffer_size ); - return true; + return STATUS_SUCCESSFUL; } diff --git a/testsuites/sptests/sp77/init.c b/testsuites/sptests/sp77/init.c index 2c4a71a73c..ada13643fa 100644 --- a/testsuites/sptests/sp77/init.c +++ b/testsuites/sptests/sp77/init.c @@ -32,7 +32,7 @@ rtems_task Init( &id ); - fatal_directive_check_status_only(status , RTEMS_UNSATISFIED , + fatal_directive_check_status_only(status , RTEMS_INVALID_SIZE , "attempt to create message queue return: "); TEST_END(); diff --git a/testsuites/sptests/spmsgq_err01/init.c b/testsuites/sptests/spmsgq_err01/init.c index 1ff8490d1a..f0c889a1ff 100644 --- a/testsuites/sptests/spmsgq_err01/init.c +++ b/testsuites/sptests/spmsgq_err01/init.c @@ -101,8 +101,9 @@ rtems_task Init( /* not enough memory for messages */ status = rtems_message_queue_create( Queue_name[ 1 ], - INT_MAX, - MESSAGE_SIZE, + SIZE_MAX + / ( sizeof( uintptr_t ) + sizeof( CORE_message_queue_Buffer_control ) ), + 1, RTEMS_DEFAULT_ATTRIBUTES, &Queue_id[ 1 ] ); @@ -123,10 +124,10 @@ rtems_task Init( ); fatal_directive_status( status, - RTEMS_UNSATISFIED, - "rtems_message_queue_create unsatisfied" + RTEMS_INVALID_NUMBER, + "rtems_message_queue_create invalid number" ); - puts( "TA1 - rtems_message_queue_create - Q 2 - RTEMS_UNSATISFIED #2" ); + puts( "TA1 - rtems_message_queue_create - Q 2 - RTEMS_INVALID_NUMBER" ); status = rtems_message_queue_create( Queue_name[ 1 ], |