summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-05-10 18:47:35 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-05-10 18:47:35 +0000
commit45d406f8e91368a90b69868756865eefc58eee4a (patch)
tree62329dab332b2822224cf7d1ee29654923590eba /cpukit
parent2007-05-10 Joel Sherrill <joel.sherrill@OARcorp.com> (diff)
downloadrtems-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/ChangeLog6
-rw-r--r--cpukit/score/src/threadchangepriority.c6
-rw-r--r--cpukit/score/src/threadqrequeue.c12
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;
- }
+ }
+ }
}