summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/schedulersimplesmp.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-03 15:03:35 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-04 11:01:18 +0200
commit24934e36e2513f972510d7c746103be1f766dc6a (patch)
tree66e3c8840cec6c1262f142e25ec545926140dbf9 /cpukit/score/src/schedulersimplesmp.c
parentscore: Add and use Scheduler_simple_Control (diff)
downloadrtems-24934e36e2513f972510d7c746103be1f766dc6a.tar.bz2
score: Add scheduler control to scheduler ops
Scheduler operations must be free of a global scheduler context to enable partitioned/clustered scheduling.
Diffstat (limited to 'cpukit/score/src/schedulersimplesmp.c')
-rw-r--r--cpukit/score/src/schedulersimplesmp.c90
1 files changed, 58 insertions, 32 deletions
diff --git a/cpukit/score/src/schedulersimplesmp.c b/cpukit/score/src/schedulersimplesmp.c
index d222d02d42..20a35af07a 100644
--- a/cpukit/score/src/schedulersimplesmp.c
+++ b/cpukit/score/src/schedulersimplesmp.c
@@ -22,16 +22,17 @@
#include <rtems/score/schedulersmpimpl.h>
#include <rtems/score/wkspace.h>
-static Scheduler_simple_SMP_Control *_Scheduler_simple_SMP_Instance( void )
+static Scheduler_simple_SMP_Control *
+_Scheduler_simple_SMP_Self_from_base( Scheduler_Control *base )
{
- return _Scheduler.information;
+ return (Scheduler_simple_SMP_Control *) base->information;
}
static Scheduler_simple_SMP_Control *
-_Scheduler_simple_SMP_Self_from_SMP_base( Scheduler_SMP_Control *base )
+_Scheduler_simple_SMP_Self_from_SMP_base( Scheduler_SMP_Control *smp_base )
{
return (Scheduler_simple_SMP_Control *)
- ( (char *) base - offsetof( Scheduler_simple_SMP_Control, Base ) );
+ ( (char *) smp_base - offsetof( Scheduler_simple_SMP_Control, Base ) );
}
void _Scheduler_simple_smp_Initialize( void )
@@ -46,11 +47,11 @@ void _Scheduler_simple_smp_Initialize( void )
}
static Thread_Control *_Scheduler_simple_smp_Get_highest_ready(
- Scheduler_SMP_Control *base
+ Scheduler_SMP_Control *smp_base
)
{
Scheduler_simple_SMP_Control *self =
- _Scheduler_simple_SMP_Self_from_SMP_base( base );
+ _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
Thread_Control *highest_ready = NULL;
Chain_Control *ready = &self->Ready;
@@ -62,12 +63,12 @@ static Thread_Control *_Scheduler_simple_smp_Get_highest_ready(
}
static void _Scheduler_simple_smp_Move_from_scheduled_to_ready(
- Scheduler_SMP_Control *base,
+ Scheduler_SMP_Control *smp_base,
Thread_Control *scheduled_to_ready
)
{
Scheduler_simple_SMP_Control *self =
- _Scheduler_simple_SMP_Self_from_SMP_base( base );
+ _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
_Chain_Extract_unprotected( &scheduled_to_ready->Object.Node );
_Scheduler_simple_Insert_priority_lifo(
@@ -77,24 +78,24 @@ static void _Scheduler_simple_smp_Move_from_scheduled_to_ready(
}
static void _Scheduler_simple_smp_Move_from_ready_to_scheduled(
- Scheduler_SMP_Control *base,
+ Scheduler_SMP_Control *smp_base,
Thread_Control *ready_to_scheduled
)
{
_Chain_Extract_unprotected( &ready_to_scheduled->Object.Node );
_Scheduler_simple_Insert_priority_fifo(
- &base->Scheduled,
+ &smp_base->Scheduled,
ready_to_scheduled
);
}
static void _Scheduler_simple_smp_Insert_ready_lifo(
- Scheduler_SMP_Control *base,
+ Scheduler_SMP_Control *smp_base,
Thread_Control *thread
)
{
Scheduler_simple_SMP_Control *self =
- _Scheduler_simple_SMP_Self_from_SMP_base( base );
+ _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
_Chain_Insert_ordered_unprotected(
&self->Ready,
@@ -104,12 +105,12 @@ static void _Scheduler_simple_smp_Insert_ready_lifo(
}
static void _Scheduler_simple_smp_Insert_ready_fifo(
- Scheduler_SMP_Control *base,
+ Scheduler_SMP_Control *smp_base,
Thread_Control *thread
)
{
Scheduler_simple_SMP_Control *self =
- _Scheduler_simple_SMP_Self_from_SMP_base( base );
+ _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
_Chain_Insert_ordered_unprotected(
&self->Ready,
@@ -119,11 +120,11 @@ static void _Scheduler_simple_smp_Insert_ready_fifo(
}
static void _Scheduler_simple_smp_Do_extract(
- Scheduler_SMP_Control *base,
+ Scheduler_SMP_Control *smp_base,
Thread_Control *thread
)
{
- (void) base;
+ (void) smp_base;
thread->is_in_the_air = thread->is_scheduled;
thread->is_scheduled = false;
@@ -131,9 +132,13 @@ static void _Scheduler_simple_smp_Do_extract(
_Chain_Extract_unprotected( &thread->Object.Node );
}
-void _Scheduler_simple_smp_Block( Thread_Control *thread )
+void _Scheduler_simple_smp_Block(
+ Scheduler_Control *base,
+ Thread_Control *thread
+)
{
- Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance();
+ Scheduler_simple_SMP_Control *self =
+ _Scheduler_simple_SMP_Self_from_base( base );
_Scheduler_SMP_Block(
&self->Base,
@@ -145,7 +150,7 @@ void _Scheduler_simple_smp_Block( Thread_Control *thread )
}
static void _Scheduler_simple_smp_Enqueue_ordered(
- Scheduler_SMP_Control *base,
+ Scheduler_SMP_Control *smp_base,
Thread_Control *thread,
Chain_Node_order order,
Scheduler_SMP_Insert insert_ready,
@@ -153,7 +158,7 @@ static void _Scheduler_simple_smp_Enqueue_ordered(
)
{
_Scheduler_SMP_Enqueue_ordered(
- base,
+ smp_base,
thread,
order,
_Scheduler_simple_smp_Get_highest_ready,
@@ -164,9 +169,13 @@ static void _Scheduler_simple_smp_Enqueue_ordered(
);
}
-void _Scheduler_simple_smp_Enqueue_priority_lifo( Thread_Control *thread )
+void _Scheduler_simple_smp_Enqueue_priority_lifo(
+ Scheduler_Control *base,
+ Thread_Control *thread
+)
{
- Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance();
+ Scheduler_simple_SMP_Control *self =
+ _Scheduler_simple_SMP_Self_from_base( base );
_Scheduler_simple_smp_Enqueue_ordered(
&self->Base,
@@ -177,9 +186,13 @@ void _Scheduler_simple_smp_Enqueue_priority_lifo( Thread_Control *thread )
);
}
-void _Scheduler_simple_smp_Enqueue_priority_fifo( Thread_Control *thread )
+void _Scheduler_simple_smp_Enqueue_priority_fifo(
+ Scheduler_Control *base,
+ Thread_Control *thread
+)
{
- Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance();
+ Scheduler_simple_SMP_Control *self =
+ _Scheduler_simple_SMP_Self_from_base( base );
_Scheduler_simple_smp_Enqueue_ordered(
&self->Base,
@@ -190,9 +203,13 @@ void _Scheduler_simple_smp_Enqueue_priority_fifo( Thread_Control *thread )
);
}
-void _Scheduler_simple_smp_Extract( Thread_Control *thread )
+void _Scheduler_simple_smp_Extract(
+ Scheduler_Control *base,
+ Thread_Control *thread
+)
{
- Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance();
+ Scheduler_simple_SMP_Control *self =
+ _Scheduler_simple_SMP_Self_from_base( base );
_Scheduler_SMP_Extract(
&self->Base,
@@ -201,21 +218,28 @@ void _Scheduler_simple_smp_Extract( Thread_Control *thread )
);
}
-void _Scheduler_simple_smp_Yield( Thread_Control *thread )
+void _Scheduler_simple_smp_Yield(
+ Scheduler_Control *base,
+ Thread_Control *thread
+)
{
ISR_Level level;
_ISR_Disable( level );
- _Scheduler_simple_smp_Extract( thread );
- _Scheduler_simple_smp_Enqueue_priority_fifo( thread );
+ _Scheduler_simple_smp_Extract( base, thread );
+ _Scheduler_simple_smp_Enqueue_priority_fifo( base, thread );
_ISR_Enable( level );
}
-void _Scheduler_simple_smp_Schedule( Thread_Control *thread )
+void _Scheduler_simple_smp_Schedule(
+ Scheduler_Control *base,
+ Thread_Control *thread
+)
{
- Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance();
+ Scheduler_simple_SMP_Control *self =
+ _Scheduler_simple_SMP_Self_from_base( base );
_Scheduler_SMP_Schedule(
&self->Base,
@@ -226,11 +250,13 @@ void _Scheduler_simple_smp_Schedule( Thread_Control *thread )
}
void _Scheduler_simple_smp_Start_idle(
+ Scheduler_Control *base,
Thread_Control *thread,
Per_CPU_Control *cpu
)
{
- Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance();
+ Scheduler_simple_SMP_Control *self =
+ _Scheduler_simple_SMP_Self_from_base( base );
_Scheduler_SMP_Start_idle( &self->Base, thread, cpu );
}