diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-06-12 14:37:57 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-06-12 16:13:26 +0200 |
commit | 701dd96f598bd58a41884795ba5bf0b5da337d78 (patch) | |
tree | 2d8374400a2622c19ad5215e0d1e150eebda1396 /cpukit/score/src/schedulerdefaulttick.c | |
parent | bsp/realview-pbx-a9: Fix SMP startup (diff) | |
download | rtems-701dd96f598bd58a41884795ba5bf0b5da337d78.tar.bz2 |
score: PR2181: Add _Thread_Yield()
The _Scheduler_Yield() was called by the executing thread with thread
dispatching disabled and interrupts enabled. The rtems_task_suspend()
is explicitly allowed in ISRs:
http://rtems.org/onlinedocs/doc-current/share/rtems/html/c_user/Interrupt-Manager-Directives-Allowed-from-an-ISR.html#Interrupt-Manager-Directives-Allowed-from-an-ISR
Unlike the other scheduler operations the locking was performed inside
the operation. This lead to the following race condition. Suppose a
ISR suspends the executing thread right before the yield scheduler
operation. Now the executing thread is not longer in the set of ready
threads. The typical scheduler operations did not check the thread
state and will now extract the thread again and enqueue it. This
corrupted data structures.
Add _Thread_Yield() and do the scheduler yield operation with interrupts
disabled. This has a negligible effect on the interrupt latency.
Diffstat (limited to 'cpukit/score/src/schedulerdefaulttick.c')
-rw-r--r-- | cpukit/score/src/schedulerdefaulttick.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/cpukit/score/src/schedulerdefaulttick.c b/cpukit/score/src/schedulerdefaulttick.c index 98cd05e1c0..db67ca1508 100644 --- a/cpukit/score/src/schedulerdefaulttick.c +++ b/cpukit/score/src/schedulerdefaulttick.c @@ -29,6 +29,8 @@ void _Scheduler_default_Tick( Thread_Control *executing ) { + (void) scheduler; + #ifdef __RTEMS_USE_TICKS_FOR_STATISTICS__ /* * Increment the number of ticks this thread has been executing @@ -69,7 +71,7 @@ void _Scheduler_default_Tick( * currently executing thread is placed at the rear of the * FIFO for this priority and a new heir is selected. */ - _Scheduler_Yield( scheduler, executing ); + _Thread_Yield( executing ); executing->cpu_time_budget = rtems_configuration_get_ticks_per_timeslice(); } |