summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-14 15:57:54 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-22 14:00:28 +0200
commit5a32c486f9b7bd8687af253931b47d7abb091bc3 (patch)
tree31f97524b91bb123eb316b00e8056e5d62cf5200 /cpukit/posix/src
parentposix: Rework sporadic server scheduling policy (diff)
downloadrtems-5a32c486f9b7bd8687af253931b47d7abb091bc3.tar.bz2
posix: Make POSIX API aware of scheduler instances
Diffstat (limited to 'cpukit/posix/src')
-rw-r--r--cpukit/posix/src/mutexgetprioceiling.c1
-rw-r--r--cpukit/posix/src/mutexinit.c5
-rw-r--r--cpukit/posix/src/mutexsetprioceiling.c35
-rw-r--r--cpukit/posix/src/psxpriorityisvalid.c8
-rw-r--r--cpukit/posix/src/pthread.c4
-rw-r--r--cpukit/posix/src/pthreadcreate.c11
-rw-r--r--cpukit/posix/src/pthreadgetschedparam.c17
-rw-r--r--cpukit/posix/src/pthreadsetschedparam.c11
-rw-r--r--cpukit/posix/src/pthreadsetschedprio.c7
9 files changed, 63 insertions, 36 deletions
diff --git a/cpukit/posix/src/mutexgetprioceiling.c b/cpukit/posix/src/mutexgetprioceiling.c
index 2df4776048..eda02cba83 100644
--- a/cpukit/posix/src/mutexgetprioceiling.c
+++ b/cpukit/posix/src/mutexgetprioceiling.c
@@ -46,6 +46,7 @@ int pthread_mutex_getprioceiling(
_POSIX_Mutex_Acquire_critical( the_mutex, &queue_context );
*prioceiling = _POSIX_Priority_From_core(
+ &_Scheduler_Table[ 0 ],
the_mutex->Mutex.priority_ceiling
);
diff --git a/cpukit/posix/src/mutexinit.c b/cpukit/posix/src/mutexinit.c
index 0d4833ed90..04c36e11bb 100644
--- a/cpukit/posix/src/mutexinit.c
+++ b/cpukit/posix/src/mutexinit.c
@@ -20,6 +20,7 @@
#include <rtems/posix/muteximpl.h>
#include <rtems/posix/priorityimpl.h>
+#include <rtems/score/schedulerimpl.h>
/**
* 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
@@ -115,11 +116,11 @@ int pthread_mutex_init(
prio_ceiling = _POSIX_Priority_Get_maximum( scheduler );
}
- if ( !_POSIX_Priority_Is_valid( prio_ceiling ) ) {
+ if ( !_POSIX_Priority_Is_valid( scheduler, prio_ceiling ) ) {
return EINVAL;
}
- priority = _POSIX_Priority_To_core( prio_ceiling );
+ priority = _POSIX_Priority_To_core( scheduler, prio_ceiling );
}
the_mutex = _POSIX_Mutex_Allocate();
diff --git a/cpukit/posix/src/mutexsetprioceiling.c b/cpukit/posix/src/mutexsetprioceiling.c
index 96e8dbfeba..65b93c7a56 100644
--- a/cpukit/posix/src/mutexsetprioceiling.c
+++ b/cpukit/posix/src/mutexsetprioceiling.c
@@ -31,18 +31,14 @@ int pthread_mutex_setprioceiling(
int *old_ceiling
)
{
- register POSIX_Mutex_Control *the_mutex;
- Priority_Control the_priority;
- int error;
+ POSIX_Mutex_Control *the_mutex;
+ const Scheduler_Control *scheduler;
+ int error;
+ int unlock_error;
if ( !old_ceiling )
return EINVAL;
- if ( !_POSIX_Priority_Is_valid( prioceiling ) )
- return EINVAL;
-
- the_priority = _POSIX_Priority_To_core( prioceiling );
-
/*
* Must acquire the mutex before we can change it's ceiling.
* POSIX says block until we acquire it.
@@ -56,13 +52,26 @@ int pthread_mutex_setprioceiling(
the_mutex = _POSIX_Mutex_Get_no_protection( mutex );
_Assert( the_mutex != NULL );
+ scheduler = &_Scheduler_Table[ 0 ];
+
*old_ceiling = _POSIX_Priority_From_core(
+ scheduler,
the_mutex->Mutex.priority_ceiling
);
- the_mutex->Mutex.priority_ceiling = the_priority;
- error = pthread_mutex_unlock( mutex );
- _Assert( error == 0 );
- (void) error;
- return 0;
+ if ( _POSIX_Priority_Is_valid( scheduler, prioceiling ) ) {
+ Priority_Control priority;
+
+ priority = _POSIX_Priority_To_core( scheduler, prioceiling );
+ the_mutex->Mutex.priority_ceiling = priority;
+
+ error = 0;
+ } else {
+ error = EINVAL;
+ }
+
+ unlock_error = pthread_mutex_unlock( mutex );
+ _Assert( unlock_error == 0 );
+ (void) unlock_error;
+ return error;
}
diff --git a/cpukit/posix/src/psxpriorityisvalid.c b/cpukit/posix/src/psxpriorityisvalid.c
index c883416c86..ea7f6f4382 100644
--- a/cpukit/posix/src/psxpriorityisvalid.c
+++ b/cpukit/posix/src/psxpriorityisvalid.c
@@ -30,11 +30,11 @@ int _POSIX_Priority_Get_maximum( const Scheduler_Control *scheduler )
}
bool _POSIX_Priority_Is_valid(
- int priority
+ const Scheduler_Control *scheduler,
+ int priority
)
{
- return ((priority >= POSIX_SCHEDULER_MINIMUM_PRIORITY) &&
- (priority <= POSIX_SCHEDULER_MAXIMUM_PRIORITY));
-
+ return priority >= POSIX_SCHEDULER_MINIMUM_PRIORITY
+ && (Priority_Control) priority < scheduler->maximum_priority;
}
diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
index ca7efa9c7d..b29acaeea5 100644
--- a/cpukit/posix/src/pthread.c
+++ b/cpukit/posix/src/pthread.c
@@ -37,8 +37,9 @@
#include <rtems/posix/psignalimpl.h>
#include <rtems/posix/config.h>
#include <rtems/posix/keyimpl.h>
-#include <rtems/score/cpusetimpl.h>
#include <rtems/score/assert.h>
+#include <rtems/score/cpusetimpl.h>
+#include <rtems/score/schedulerimpl.h>
Thread_Information _POSIX_Threads_Information;
@@ -182,6 +183,7 @@ static bool _POSIX_Threads_Create_extension(
api->thread = created;
_POSIX_Threads_Initialize_attributes( &api->Attributes );
api->Attributes.schedparam.sched_priority = _POSIX_Priority_From_core(
+ _Scheduler_Get_own( created ),
created->current_priority
);
diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c
index f2fc1ca68e..a4b468494a 100644
--- a/cpukit/posix/src/pthreadcreate.c
+++ b/cpukit/posix/src/pthreadcreate.c
@@ -70,6 +70,7 @@ int pthread_create(
bool status;
Thread_Control *the_thread;
Thread_Control *executing;
+ const Scheduler_Control *scheduler;
POSIX_API_Control *api;
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
@@ -151,16 +152,18 @@ int pthread_create(
high_prio = low_prio;
}
- if ( !_POSIX_Priority_Is_valid( low_prio ) ) {
+ scheduler = _Scheduler_Get_own( executing );
+
+ if ( !_POSIX_Priority_Is_valid( scheduler, low_prio ) ) {
return EINVAL;
}
- if ( !_POSIX_Priority_Is_valid( high_prio ) ) {
+ if ( !_POSIX_Priority_Is_valid( scheduler, high_prio ) ) {
return EINVAL;
}
- core_low_prio = _POSIX_Priority_To_core( low_prio );
- core_high_prio = _POSIX_Priority_To_core( high_prio );
+ core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio );
+ core_high_prio = _POSIX_Priority_To_core( scheduler, high_prio );
#if defined(RTEMS_SMP)
#if __RTEMS_HAVE_SYS_CPUSET_H__
diff --git a/cpukit/posix/src/pthreadgetschedparam.c b/cpukit/posix/src/pthreadgetschedparam.c
index 6751c647d7..a0a4c6e15b 100644
--- a/cpukit/posix/src/pthreadgetschedparam.c
+++ b/cpukit/posix/src/pthreadgetschedparam.c
@@ -26,6 +26,7 @@
#include <rtems/posix/pthreadimpl.h>
#include <rtems/posix/priorityimpl.h>
+#include <rtems/score/schedulerimpl.h>
#include <rtems/score/threadimpl.h>
int pthread_getschedparam(
@@ -34,9 +35,11 @@ int pthread_getschedparam(
struct sched_param *param
)
{
- Thread_Control *the_thread;
- ISR_lock_Context lock_context;
- POSIX_API_Control *api;
+ Thread_Control *the_thread;
+ ISR_lock_Context lock_context;
+ POSIX_API_Control *api;
+ const Scheduler_Control *scheduler;
+ Priority_Control priority;
if ( policy == NULL || param == NULL ) {
return EINVAL;
@@ -54,10 +57,12 @@ int pthread_getschedparam(
*policy = api->Attributes.schedpolicy;
*param = api->Attributes.schedparam;
- param->sched_priority = _POSIX_Priority_From_core(
- the_thread->real_priority
- );
+
+ scheduler = _Scheduler_Get_own( the_thread );
+ priority = the_thread->real_priority;
_Thread_Lock_release_default( the_thread, &lock_context );
+
+ param->sched_priority = _POSIX_Priority_From_core( scheduler, priority );
return 0;
}
diff --git a/cpukit/posix/src/pthreadsetschedparam.c b/cpukit/posix/src/pthreadsetschedparam.c
index 15d016fce7..148391dcc4 100644
--- a/cpukit/posix/src/pthreadsetschedparam.c
+++ b/cpukit/posix/src/pthreadsetschedparam.c
@@ -28,6 +28,7 @@
#include <rtems/posix/pthreadimpl.h>
#include <rtems/posix/priorityimpl.h>
#include <rtems/score/threadimpl.h>
+#include <rtems/score/schedulerimpl.h>
typedef struct {
int policy;
@@ -45,6 +46,7 @@ static bool _POSIX_Set_sched_param_filter(
{
POSIX_Set_sched_param_context *context;
const struct sched_param *param;
+ const Scheduler_Control *scheduler;
POSIX_API_Control *api;
int low_prio;
int high_prio;
@@ -54,6 +56,7 @@ static bool _POSIX_Set_sched_param_filter(
context = arg;
param = context->param;
+ scheduler = _Scheduler_Get_own( the_thread );
if ( context->policy == SCHED_SPORADIC ) {
low_prio = param->sched_ss_low_priority;
@@ -63,18 +66,18 @@ static bool _POSIX_Set_sched_param_filter(
high_prio = low_prio;
}
- if ( !_POSIX_Priority_Is_valid( low_prio ) ) {
+ if ( !_POSIX_Priority_Is_valid( scheduler, low_prio ) ) {
context->error = EINVAL;
return false;
}
- if ( !_POSIX_Priority_Is_valid( high_prio ) ) {
+ if ( !_POSIX_Priority_Is_valid( scheduler, high_prio ) ) {
context->error = EINVAL;
return false;
}
- core_low_prio = _POSIX_Priority_To_core( low_prio );
- core_high_prio = _POSIX_Priority_To_core( high_prio );
+ core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio );
+ core_high_prio = _POSIX_Priority_To_core( scheduler, high_prio );
*new_priority_p = core_high_prio;
diff --git a/cpukit/posix/src/pthreadsetschedprio.c b/cpukit/posix/src/pthreadsetschedprio.c
index 25dc59fb11..dace70ad1f 100644
--- a/cpukit/posix/src/pthreadsetschedprio.c
+++ b/cpukit/posix/src/pthreadsetschedprio.c
@@ -16,6 +16,7 @@
#include <rtems/posix/priorityimpl.h>
#include <rtems/posix/threadsup.h>
#include <rtems/score/threadimpl.h>
+#include <rtems/score/schedulerimpl.h>
typedef struct {
int prio;
@@ -30,19 +31,21 @@ static bool _POSIX_Set_sched_prio_filter(
{
POSIX_Set_sched_prio_context *context;
int prio;
+ const Scheduler_Control *scheduler;
POSIX_API_Control *api;
Priority_Control current_priority;
Priority_Control new_priority;
context = arg;
prio = context->prio;
+ scheduler = _Scheduler_Get_own( the_thread );
- if ( !_POSIX_Priority_Is_valid( prio ) ) {
+ if ( !_POSIX_Priority_Is_valid( scheduler, prio ) ) {
context->error = EINVAL;
return false;
}
- new_priority = _POSIX_Priority_To_core( prio );
+ new_priority = _POSIX_Priority_To_core( scheduler, prio );
*new_priority_p = new_priority;
current_priority = the_thread->current_priority;