diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-05-10 18:47:35 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-05-10 18:47:35 +0000 |
commit | 45d406f8e91368a90b69868756865eefc58eee4a (patch) | |
tree | 62329dab332b2822224cf7d1ee29654923590eba /cpukit | |
parent | 2007-05-10 Joel Sherrill <joel.sherrill@OARcorp.com> (diff) | |
download | rtems-45d406f8e91368a90b69868756865eefc58eee4a.tar.bz2 |
2007-05-10 Joel Sherrill <joel.sherrill@OARcorp.com>
PR 1241/rtems
* score/src/threadchangepriority.c, score/src/threadqrequeue.c: Close
critical section window added with requeueing support.
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/ChangeLog | 6 | ||||
-rw-r--r-- | cpukit/score/src/threadchangepriority.c | 6 | ||||
-rw-r--r-- | cpukit/score/src/threadqrequeue.c | 12 |
3 files changed, 17 insertions, 7 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index 362aeecb1c..58a97185cc 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,9 @@ +2007-05-10 Joel Sherrill <joel.sherrill@OARcorp.com> + + PR 1241/rtems + * score/src/threadchangepriority.c, score/src/threadqrequeue.c: Close + critical section window added with requeueing support. + 2007-05-10 Ralf Corsépius <ralf.corsepius@rtems.org> * libcsupport/include/rtems/cdefs.h, diff --git a/cpukit/score/src/threadchangepriority.c b/cpukit/score/src/threadchangepriority.c index 9847f54f80..70ec45cb51 100644 --- a/cpukit/score/src/threadchangepriority.c +++ b/cpukit/score/src/threadchangepriority.c @@ -95,13 +95,11 @@ void _Thread_Change_priority( */ state = the_thread->current_state; if ( state != STATES_TRANSIENT ) { + the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); + _ISR_Enable( level ); if ( _States_Is_waiting_on_thread_queue( state ) ) { - _ISR_Enable( level ); _Thread_queue_Requeue( the_thread->Wait.queue, the_thread ); - _ISR_Disable( level ); /* redisable so state is cleared with ISR off */ } - the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); - _ISR_Enable( level ); return; } diff --git a/cpukit/score/src/threadqrequeue.c b/cpukit/score/src/threadqrequeue.c index a15aafcb78..a536eecdcf 100644 --- a/cpukit/score/src/threadqrequeue.c +++ b/cpukit/score/src/threadqrequeue.c @@ -47,8 +47,9 @@ void _Thread_queue_Requeue( ) { /* just in case the thread really wasn't blocked here */ - if ( !the_thread_queue ) + if ( !the_thread_queue ) { return; + } switch ( the_thread_queue->discipline ) { case THREAD_QUEUE_DISCIPLINE_FIFO: @@ -56,12 +57,17 @@ void _Thread_queue_Requeue( break; case THREAD_QUEUE_DISCIPLINE_PRIORITY: { Thread_queue_Control *tq = the_thread_queue; + ISR_Level level; - _Thread_queue_Enter_critical_section( tq ); + _ISR_Disable( level ); + if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { + _Thread_queue_Enter_critical_section( tq ); _Thread_queue_Extract_priority_helper( tq, the_thread, TRUE ); _Thread_queue_Enqueue_priority( tq, the_thread ); } + _ISR_Enable( level ); break; - } + } + } } |