summaryrefslogtreecommitdiffstats
path: root/c/src/exec/posix/src/pthread.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1996-06-06 14:53:12 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1996-06-06 14:53:12 +0000
commit624133c6f4ec7b1d03f4116b656decee3132b9a0 (patch)
tree9b0f36bf29d15af83ca75308b1b39ea861bb1c05 /c/src/exec/posix/src/pthread.c
parentadded Sporadic_timer field to support sporadic server (diff)
downloadrtems-624133c6f4ec7b1d03f4116b656decee3132b9a0.tar.bz2
added Sporadic Server support
Diffstat (limited to 'c/src/exec/posix/src/pthread.c')
-rw-r--r--c/src/exec/posix/src/pthread.c136
1 files changed, 109 insertions, 27 deletions
diff --git a/c/src/exec/posix/src/pthread.c b/c/src/exec/posix/src/pthread.c
index 7ffa08b065..5ac573c6ce 100644
--- a/c/src/exec/posix/src/pthread.c
+++ b/c/src/exec/posix/src/pthread.c
@@ -16,6 +16,7 @@
#include <rtems/posix/pthread.h>
#include <rtems/posix/priority.h>
#include <rtems/posix/config.h>
+#include <rtems/posix/time.h>
/*PAGE
*
@@ -606,6 +607,60 @@ int pthread_attr_setdetachstate(
/*PAGE
*
+ * _POSIX_Threads_Sporadic_budget_TSR
+ */
+
+void _POSIX_Threads_Sporadic_budget_TSR(
+ Objects_Id id,
+ void *argument
+)
+{
+ Thread_Control *the_thread;
+ POSIX_API_Control *api;
+
+ the_thread = argument;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ the_thread->cpu_time_budget =
+ _POSIX_Timespec_to_interval( &api->schedparam.ss_initial_budget );
+
+ _Thread_Change_priority(
+ the_thread,
+ _POSIX_Priority_To_core( api->schedparam.sched_priority )
+ );
+
+ _Watchdog_Insert_ticks(
+ &api->Sporadic_timer,
+ _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Sporadic_budget_callout
+ */
+
+void _POSIX_Threads_Sporadic_budget_callout(
+ Thread_Control *the_thread
+)
+{
+ POSIX_API_Control *api;
+
+ /* XXX really should be based on MAX_U32 */
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ the_thread->cpu_time_budget = 0xFFFFFFFF;
+
+ _Thread_Change_priority(
+ the_thread,
+ _POSIX_Priority_To_core( api->schedparam.ss_low_priority )
+ );
+}
+
+/*PAGE
+ *
* 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144
*/
@@ -616,16 +671,17 @@ int pthread_create(
void *arg
)
{
- const pthread_attr_t *the_attr;
- Priority_Control core_priority;
- boolean is_timesliced;
- boolean is_fp;
- boolean status;
- Thread_Control *the_thread;
- char *default_name = "psx";
- POSIX_API_Control *api;
- int schedpolicy = SCHED_RR;
- struct sched_param schedparam;
+ const pthread_attr_t *the_attr;
+ Priority_Control core_priority;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ boolean is_fp;
+ boolean status;
+ Thread_Control *the_thread;
+ char *default_name = "psx";
+ POSIX_API_Control *api;
+ int schedpolicy = SCHED_RR;
+ struct sched_param schedparam;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
@@ -641,12 +697,8 @@ int pthread_create(
return EINVAL;
#if 0
- int schedpolicy;
- struct sched_param schedparam;
-
-#if defined(_POSIX_THREAD_CPUTIME)
int cputime_clock_allowed; /* see time.h */
-#endif
+ POSIX_NOT_IMPLEMENTED();
#endif
/*
@@ -686,27 +738,42 @@ int pthread_create(
* Interpret the scheduling parameters.
*/
- is_timesliced = FALSE;
-
- if ( !_POSIX_Priority_Is_valid( the_attr->schedparam.sched_priority ) )
+ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
return EINVAL;
- core_priority = _POSIX_Priority_To_core(the_attr->schedparam.sched_priority);
+ core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
+ /*
+ * Set the core scheduling policy information.
+ */
+
+ budget_callout = NULL;
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+
switch ( schedpolicy ) {
case SCHED_OTHER:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
+ break;
+
case SCHED_FIFO:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
break;
+
case SCHED_RR:
- is_timesliced = TRUE;
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
break;
+
case SCHED_SPORADIC:
- /* XXX interpret the following parameters */
-#if 0
- ss_low_priority; /* Low scheduling priority for sporadic */
- ss_replenish_period; /* Replenishment period for sporadic server */
- ss_initial_budget; /* Initial budget for sporadic server */
-#endif
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+ budget_callout = _POSIX_Threads_Sporadic_budget_callout;
+
+ if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) <
+ _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) )
+ return EINVAL;
+
break;
}
@@ -748,7 +815,8 @@ int pthread_create(
is_fp,
core_priority,
TRUE, /* preemptible */
- is_timesliced, /* timesliced */
+ budget_algorithm,
+ budget_callout,
0, /* isr level */
&default_name /* posix threads don't have a name */
);
@@ -792,6 +860,20 @@ int pthread_create(
0 /* unused */
);
+ if ( schedpolicy == SCHED_SPORADIC ) {
+ _Watchdog_Initialize(
+ &api->Sporadic_timer,
+ _POSIX_Threads_Sporadic_budget_TSR,
+ the_thread->Object.id,
+ the_thread
+ );
+
+ _Watchdog_Insert_ticks(
+ &api->Sporadic_timer,
+ _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
+ );
+ }
+
/*
* _Thread_Start only fails if the thread was in the incorrect state
*/