diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/ChangeLog | 9 | ||||
-rw-r--r-- | cpukit/score/inline/rtems/score/coremsg.inl | 11 | ||||
-rw-r--r-- | cpukit/score/macros/rtems/score/coremsg.inl | 10 | ||||
-rw-r--r-- | cpukit/score/src/coremsginsert.c | 27 |
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 ); } |