summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/schedulerprioritysmp.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-01 11:48:59 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-03 11:13:26 +0200
commit494c2e300215c4bc539d243d6a5d060e0e2f2ef2 (patch)
tree8ba7c54667cad8331430bf719b4a1bd94ed3ac8b /cpukit/score/src/schedulerprioritysmp.c
parentscore: Rename Priority_bit_map_Control (diff)
downloadrtems-494c2e300215c4bc539d243d6a5d060e0e2f2ef2.tar.bz2
score: Move priority bit map to scheduler instance
Delete global variables _Priority_Major_bit_map and _Priority_Bit_map. This makes it possible to use multiple priority scheduler instances for example with clustered/partitioned scheduling on SMP.
Diffstat (limited to 'cpukit/score/src/schedulerprioritysmp.c')
-rw-r--r--cpukit/score/src/schedulerprioritysmp.c115
1 files changed, 83 insertions, 32 deletions
diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c
index dedd270747..458d87bdb7 100644
--- a/cpukit/score/src/schedulerprioritysmp.c
+++ b/cpukit/score/src/schedulerprioritysmp.c
@@ -7,7 +7,7 @@
*/
/*
- * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -29,100 +29,141 @@
#include <rtems/score/schedulersmpimpl.h>
#include <rtems/score/wkspace.h>
+static Scheduler_priority_SMP_Control *_Scheduler_priority_SMP_Instance( void )
+{
+ return _Scheduler.information;
+}
+
+static Scheduler_priority_SMP_Control *
+_Scheduler_priority_SMP_Self_from_SMP_base( Scheduler_SMP_Control *base )
+{
+ return (Scheduler_priority_SMP_Control *)
+ ( (char *) base
+ - offsetof( Scheduler_priority_SMP_Control, Base ) );
+}
+
void _Scheduler_priority_SMP_Initialize( void )
{
- Scheduler_SMP_Control *self = _Workspace_Allocate_or_fatal_error(
+ Scheduler_priority_SMP_Control *self = _Workspace_Allocate_or_fatal_error(
sizeof( *self ) + PRIORITY_MAXIMUM * sizeof( Chain_Control )
);
- _Chain_Initialize_empty( &self->scheduled );
- _Scheduler_priority_Ready_queue_initialize( &self->ready[ 0 ] );
+ _Scheduler_SMP_Initialize( &self->Base );
+ _Priority_bit_map_Initialize( &self->Bit_map );
+ _Scheduler_priority_Ready_queue_initialize( &self->Ready[ 0 ] );
_Scheduler.information = self;
}
void _Scheduler_priority_SMP_Update( Thread_Control *thread )
{
- Scheduler_SMP_Control *self = _Scheduler_SMP_Instance();
+ Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance();
- _Scheduler_priority_Update_body( thread, &self->ready[ 0 ] );
+ _Scheduler_priority_Update_body(
+ thread,
+ &self->Bit_map,
+ &self->Ready[ 0 ]
+ );
}
static Thread_Control *_Scheduler_priority_SMP_Get_highest_ready(
- Scheduler_SMP_Control *self
+ Scheduler_SMP_Control *base
)
{
+ Scheduler_priority_SMP_Control *self =
+ _Scheduler_priority_SMP_Self_from_SMP_base( base );
Thread_Control *highest_ready = NULL;
- if ( !_Priority_bit_map_Is_empty() ) {
- highest_ready = _Scheduler_priority_Ready_queue_first( &self->ready[ 0 ] );
+ if ( !_Priority_bit_map_Is_empty( &self->Bit_map ) ) {
+ highest_ready = _Scheduler_priority_Ready_queue_first(
+ &self->Bit_map,
+ &self->Ready[ 0 ]
+ );
}
return highest_ready;
}
static void _Scheduler_priority_SMP_Move_from_scheduled_to_ready(
- Scheduler_SMP_Control *self,
+ Scheduler_SMP_Control *base,
Thread_Control *scheduled_to_ready
)
{
+ Scheduler_priority_SMP_Control *self =
+ _Scheduler_priority_SMP_Self_from_SMP_base( base );
+
_Chain_Extract_unprotected( &scheduled_to_ready->Object.Node );
- _Scheduler_priority_Ready_queue_enqueue_first( scheduled_to_ready );
+ _Scheduler_priority_Ready_queue_enqueue_first(
+ scheduled_to_ready,
+ &self->Bit_map
+ );
}
static void _Scheduler_priority_SMP_Move_from_ready_to_scheduled(
- Scheduler_SMP_Control *self,
+ Scheduler_SMP_Control *base,
Thread_Control *ready_to_scheduled
)
{
- _Scheduler_priority_Ready_queue_extract( ready_to_scheduled );
+ Scheduler_priority_SMP_Control *self =
+ _Scheduler_priority_SMP_Self_from_SMP_base( base );
+
+ _Scheduler_priority_Ready_queue_extract(
+ ready_to_scheduled,
+ &self->Bit_map
+ );
_Scheduler_simple_Insert_priority_fifo(
- &self->scheduled,
+ &self->Base.Scheduled,
ready_to_scheduled
);
}
static void _Scheduler_priority_SMP_Insert_ready_lifo(
- Scheduler_SMP_Control *self,
+ Scheduler_SMP_Control *base,
Thread_Control *thread
)
{
- _Scheduler_priority_Ready_queue_enqueue( thread );
+ Scheduler_priority_SMP_Control *self =
+ _Scheduler_priority_SMP_Self_from_SMP_base( base );
+
+ _Scheduler_priority_Ready_queue_enqueue( thread, &self->Bit_map );
}
static void _Scheduler_priority_SMP_Insert_ready_fifo(
- Scheduler_SMP_Control *self,
+ Scheduler_SMP_Control *base,
Thread_Control *thread
)
{
- _Scheduler_priority_Ready_queue_enqueue_first( thread );
+ Scheduler_priority_SMP_Control *self =
+ _Scheduler_priority_SMP_Self_from_SMP_base( base );
+
+ _Scheduler_priority_Ready_queue_enqueue_first( thread, &self->Bit_map );
}
static void _Scheduler_priority_SMP_Do_extract(
- Scheduler_SMP_Control *self,
+ Scheduler_SMP_Control *base,
Thread_Control *thread
)
{
+ Scheduler_priority_SMP_Control *self =
+ _Scheduler_priority_SMP_Self_from_SMP_base( base );
bool is_scheduled = thread->is_scheduled;
- ( void ) self;
-
thread->is_in_the_air = is_scheduled;
thread->is_scheduled = false;
if ( is_scheduled ) {
_Chain_Extract_unprotected( &thread->Object.Node );
} else {
- _Scheduler_priority_Ready_queue_extract( thread );
+ _Scheduler_priority_Ready_queue_extract( thread, &self->Bit_map );
}
}
void _Scheduler_priority_SMP_Block( Thread_Control *thread )
{
- Scheduler_SMP_Control *self = _Scheduler_SMP_Instance();
+ Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance();
_Scheduler_SMP_Block(
- self,
+ &self->Base,
thread,
_Scheduler_priority_SMP_Do_extract,
_Scheduler_priority_SMP_Get_highest_ready,
@@ -152,10 +193,10 @@ static void _Scheduler_priority_SMP_Enqueue_ordered(
void _Scheduler_priority_SMP_Enqueue_lifo( Thread_Control *thread )
{
- Scheduler_SMP_Control *self = _Scheduler_SMP_Instance();
+ Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance();
_Scheduler_priority_SMP_Enqueue_ordered(
- self,
+ &self->Base,
thread,
_Scheduler_simple_Insert_priority_lifo_order,
_Scheduler_priority_SMP_Insert_ready_lifo,
@@ -165,10 +206,10 @@ void _Scheduler_priority_SMP_Enqueue_lifo( Thread_Control *thread )
void _Scheduler_priority_SMP_Enqueue_fifo( Thread_Control *thread )
{
- Scheduler_SMP_Control *self = _Scheduler_SMP_Instance();
+ Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance();
_Scheduler_priority_SMP_Enqueue_ordered(
- self,
+ &self->Base,
thread,
_Scheduler_simple_Insert_priority_fifo_order,
_Scheduler_priority_SMP_Insert_ready_fifo,
@@ -178,10 +219,10 @@ void _Scheduler_priority_SMP_Enqueue_fifo( Thread_Control *thread )
void _Scheduler_priority_SMP_Extract( Thread_Control *thread )
{
- Scheduler_SMP_Control *self = _Scheduler_SMP_Instance();
+ Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance();
_Scheduler_SMP_Extract(
- self,
+ &self->Base,
thread,
_Scheduler_priority_SMP_Do_extract
);
@@ -201,12 +242,22 @@ void _Scheduler_priority_SMP_Yield( Thread_Control *thread )
void _Scheduler_priority_SMP_Schedule( Thread_Control *thread )
{
- Scheduler_SMP_Control *self = _Scheduler_SMP_Instance();
+ Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance();
_Scheduler_SMP_Schedule(
- self,
+ &self->Base,
thread,
_Scheduler_priority_SMP_Get_highest_ready,
_Scheduler_priority_SMP_Move_from_ready_to_scheduled
);
}
+
+void _Scheduler_priority_SMP_Start_idle(
+ Thread_Control *thread,
+ Per_CPU_Control *cpu
+)
+{
+ Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance();
+
+ _Scheduler_SMP_Start_idle( &self->Base, thread, cpu );
+}