[PATCH 02/11] confdefs.h: Fix message queue size estimate

Sebastian Huber sebastian.huber at embedded-brains.de
Tue May 3 12:49:38 UTC 2016


Account for maximum message size alignment.  Simplify
_CORE_message_queue_Initialize().
---
 cpukit/sapi/include/confdefs.h |  3 ++-
 cpukit/score/src/coremsg.c     | 30 +++++++++++++-----------------
 2 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index e4e5331..c32a902 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -2978,7 +2978,8 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
  */
 #define CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(_messages, _size) \
     _Configure_From_workspace( \
-      (_messages) * ((_size) + sizeof(CORE_message_queue_Buffer_control)))
+      (_messages) * (_Configure_Align_up(_size, sizeof(uintptr_t)) \
+        + sizeof(CORE_message_queue_Buffer_control)))
 
 /**
  * This macro is set to the amount of memory required for pending message
diff --git a/cpukit/score/src/coremsg.c b/cpukit/score/src/coremsg.c
index 03c0587..a3a0d76 100644
--- a/cpukit/score/src/coremsg.c
+++ b/cpukit/score/src/coremsg.c
@@ -50,30 +50,26 @@ bool _CORE_message_queue_Initialize(
 )
 {
   size_t message_buffering_required = 0;
-  size_t allocated_message_size;
+  size_t aligned_message_size;
+  size_t align_mask;
 
   the_message_queue->maximum_pending_messages   = maximum_pending_messages;
   the_message_queue->number_of_pending_messages = 0;
   the_message_queue->maximum_message_size       = maximum_message_size;
   _CORE_message_queue_Set_notify( the_message_queue, NULL );
 
-  allocated_message_size = maximum_message_size;
-
-  /* 
-   * Check if allocated_message_size is aligned to uintptr-size boundary. 
-   * If not, it will increase allocated_message_size to multiplicity of pointer
-   * size.
+  /*
+   * Align up the maximum message size to be an integral multiple of the
+   * pointer size.
    */
-  if (allocated_message_size & (sizeof(uintptr_t) - 1)) {
-    allocated_message_size += sizeof(uintptr_t);
-    allocated_message_size &= ~(sizeof(uintptr_t) - 1);
-  }
+  align_mask = sizeof(uintptr_t) - 1;
+  aligned_message_size = ( maximum_message_size + align_mask ) & ~align_mask;
 
-  /* 
-   * Check for an overflow. It can occur while increasing allocated_message_size
-   * to multiplicity of uintptr_t above.
+  /*
+   * Check for an integer overflow.  It can occur while aligning up the maximum
+   * message size.
    */
-  if (allocated_message_size < maximum_message_size)
+  if (aligned_message_size < maximum_message_size)
     return false;
 
   /*
@@ -82,7 +78,7 @@ bool _CORE_message_queue_Initialize(
    */
   if ( !size_t_mult32_with_overflow(
         (size_t) maximum_pending_messages,
-        allocated_message_size + sizeof(CORE_message_queue_Buffer_control),
+        aligned_message_size + sizeof(CORE_message_queue_Buffer_control),
         &message_buffering_required ) ) 
     return false;
 
@@ -103,7 +99,7 @@ bool _CORE_message_queue_Initialize(
     &the_message_queue->Inactive_messages,
     the_message_queue->message_buffers,
     (size_t) maximum_pending_messages,
-    allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
+    aligned_message_size + sizeof( CORE_message_queue_Buffer_control )
   );
 
   _Chain_Initialize_empty( &the_message_queue->Pending_messages );
-- 
1.8.4.5




More information about the devel mailing list