summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cpukit/ChangeLog9
-rw-r--r--cpukit/score/inline/rtems/score/coremsg.inl11
-rw-r--r--cpukit/score/macros/rtems/score/coremsg.inl10
-rw-r--r--cpukit/score/src/coremsginsert.c27
4 files changed, 41 insertions, 16 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index 19818f96c4..a6ddc692a0 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,5 +1,14 @@
2005-09-01 Joel Sherrill <joel@OARcorp.com>
+ PR 820/rtems
+ * score/inline/rtems/score/coremsg.inl,
+ score/macros/rtems/score/coremsg.inl, score/src/coremsginsert.c:
+ Increment of pending message count should be atomic with insertion on
+ the pending message chain. Determination of the need to call the
+ notification handler should also be in this atomic section of code.
+
+2005-09-01 Joel Sherrill <joel@OARcorp.com>
+
PR 796/rtems
* posix/src/semtimedwait.c: sem_timedwait is supposed to use absolute
time for timeout specification. This patch is a modified version of
diff --git a/cpukit/score/inline/rtems/score/coremsg.inl b/cpukit/score/inline/rtems/score/coremsg.inl
index f78942283c..ece05d13f3 100644
--- a/cpukit/score/inline/rtems/score/coremsg.inl
+++ b/cpukit/score/inline/rtems/score/coremsg.inl
@@ -158,12 +158,15 @@ RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_priority(
* messages on the_message_queue.
*/
-RTEMS_INLINE_ROUTINE void _CORE_message_queue_Append (
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Append_unprotected (
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message
)
{
- _Chain_Append( &the_message_queue->Pending_messages, &the_message->Node );
+ _Chain_Append_unprotected(
+ &the_message_queue->Pending_messages,
+ &the_message->Node
+ );
}
/**
@@ -171,12 +174,12 @@ RTEMS_INLINE_ROUTINE void _CORE_message_queue_Append (
* messages on the_message_queue.
*/
-RTEMS_INLINE_ROUTINE void _CORE_message_queue_Prepend (
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Prepend_unprotected (
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message
)
{
- _Chain_Prepend(
+ _Chain_Prepend_unprotected(
&the_message_queue->Pending_messages,
&the_message->Node
);
diff --git a/cpukit/score/macros/rtems/score/coremsg.inl b/cpukit/score/macros/rtems/score/coremsg.inl
index 5befe419a9..4a7e3652ef 100644
--- a/cpukit/score/macros/rtems/score/coremsg.inl
+++ b/cpukit/score/macros/rtems/score/coremsg.inl
@@ -97,8 +97,9 @@
*
*/
-#define _CORE_message_queue_Append( _the_message_queue, _the_message ) \
- _Chain_Append( &(_the_message_queue)->Pending_messages, \
+#define _CORE_message_queue_Append_unprotected( \
+ _the_message_queue, _the_message ) \
+ _Chain_Append_unprotected( &(_the_message_queue)->Pending_messages, \
&(_the_message)->Node )
/*PAGE
@@ -107,8 +108,9 @@
*
*/
-#define _CORE_message_queue_Prepend( _the_message_queue, _the_message ) \
- _Chain_Prepend( &(_the_message_queue)->Pending_messages, \
+#define _CORE_message_queue_Prepend_unprotected( \
+ _the_message_queue, _the_message ) \
+ _Chain_Prepend_unprotected( &(_the_message_queue)->Pending_messages, \
&(_the_message)->Node )
/*PAGE
diff --git a/cpukit/score/src/coremsginsert.c b/cpukit/score/src/coremsginsert.c
index 4644010366..2402755447 100644
--- a/cpukit/score/src/coremsginsert.c
+++ b/cpukit/score/src/coremsginsert.c
@@ -7,7 +7,7 @@
* This core object provides task synchronization and communication functions
* via messages passed to queue objects.
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2005.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -58,19 +58,27 @@ void _CORE_message_queue_Insert_message(
CORE_message_queue_Submit_types submit_type
)
{
- the_message_queue->number_of_pending_messages += 1;
+ ISR_Level level;
+ boolean notify = FALSE;
the_message->priority = submit_type;
switch ( submit_type ) {
case CORE_MESSAGE_QUEUE_SEND_REQUEST:
- _CORE_message_queue_Append( the_message_queue, the_message );
+ _ISR_Disable( level );
+ if ( the_message_queue->number_of_pending_messages++ == 0 )
+ notify = TRUE;
+ _CORE_message_queue_Append_unprotected(the_message_queue, the_message);
+ _ISR_Enable( level );
break;
case CORE_MESSAGE_QUEUE_URGENT_REQUEST:
- _CORE_message_queue_Prepend( the_message_queue, the_message );
+ _ISR_Disable( level );
+ if ( the_message_queue->number_of_pending_messages++ == 0 )
+ notify = TRUE;
+ _CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
+ _ISR_Enable( level );
break;
default:
- /* XXX interrupt critical section needs to be addressed */
{
CORE_message_queue_Buffer_control *this_message;
Chain_Node *the_node;
@@ -89,7 +97,11 @@ void _CORE_message_queue_Insert_message(
break;
}
- _Chain_Insert( the_node->previous, &the_message->Node );
+ _ISR_Disable( level );
+ if ( the_message_queue->number_of_pending_messages++ == 0 )
+ notify = TRUE;
+ _Chain_Insert_unprotected( the_node->previous, &the_message->Node );
+ _ISR_Enable( level );
}
break;
}
@@ -100,7 +112,6 @@ void _CORE_message_queue_Insert_message(
* the message is actually in the queue at this point.
*/
- if ( the_message_queue->number_of_pending_messages == 1 &&
- the_message_queue->notify_handler )
+ if ( notify && the_message_queue->notify_handler )
(*the_message_queue->notify_handler)( the_message_queue->notify_argument );
}