diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-24 08:51:37 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-25 13:19:26 +0100 |
commit | 1fac361fb9d4ec7f5b4ad2801ee6ff5858c82942 (patch) | |
tree | 5a730a9562806fa388ca50e3be7d79a76892fbb4 | |
parent | score: Delete _Watchdog_Report() (diff) | |
download | rtems-1fac361fb9d4ec7f5b4ad2801ee6ff5858c82942.tar.bz2 |
score: PR2174: Add workaround
Add _Scheduler_FIXME_thread_priority_queues_are_broken to prevent thread
priority queues in case an EDF scheduler is used.
-rw-r--r-- | cpukit/sapi/include/confdefs.h | 6 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/scheduler.h | 6 | ||||
-rw-r--r-- | cpukit/score/src/threadq.c | 5 |
3 files changed, 17 insertions, 0 deletions
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index aca99f0dcd..b7317433d9 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -781,6 +781,12 @@ const rtems_libio_helper rtems_fs_init_helper = NULL, /* Scheduler Specific Data Pointer */ CONFIGURE_SCHEDULER_ENTRY_POINTS /* Scheduler Operations */ }; + + #if defined(CONFIGURE_SCHEDULER_EDF) + const bool _Scheduler_FIXME_thread_priority_queues_are_broken = true; + #else + const bool _Scheduler_FIXME_thread_priority_queues_are_broken = false; + #endif #endif /* diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h index ced3c00980..01d0c3a25b 100644 --- a/cpukit/score/include/rtems/score/scheduler.h +++ b/cpukit/score/include/rtems/score/scheduler.h @@ -184,6 +184,12 @@ void _Scheduler_default_Start_idle( Per_CPU_Control *processor ); +/* + * See also PR2174: Memory corruption with EDF scheduler and thread priority + * queues. + */ +extern const bool _Scheduler_FIXME_thread_priority_queues_are_broken; + /**@}*/ #ifdef __cplusplus diff --git a/cpukit/score/src/threadq.c b/cpukit/score/src/threadq.c index 463330a2f6..69b687fe1c 100644 --- a/cpukit/score/src/threadq.c +++ b/cpukit/score/src/threadq.c @@ -20,6 +20,7 @@ #include <rtems/score/threadqimpl.h> #include <rtems/score/chainimpl.h> +#include <rtems/score/scheduler.h> void _Thread_queue_Initialize( Thread_queue_Control *the_thread_queue, @@ -28,6 +29,10 @@ void _Thread_queue_Initialize( uint32_t timeout_status ) { + if ( _Scheduler_FIXME_thread_priority_queues_are_broken ) { + the_discipline = THREAD_QUEUE_DISCIPLINE_FIFO; + } + the_thread_queue->state = state; the_thread_queue->discipline = the_discipline; the_thread_queue->timeout_status = timeout_status; |