forked from Imagelibrary/rtems
Fix after this report from Peter Pointner <pr@schenk.isar.de>:
Problem: a posix thread which is created by
pthread_attr_init(&tattr);
pthread_attr_setinheritsched(&tattr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&tattr, SCHED_RR);
pthread_create(&th, &tattr, func, arg);
has a first timeslice of 2^32 ticks (changing a running thread to
SCHED_RR id ok).
I use RTEMS-4.0.0. I am not sure if the problem exists in the current CVS
head revision. If it's not fixed, the patch at the end should do it.
Peter
--- pthreadcreate.c.orig Wed Jul 28 14:45:58 1999
+++ pthreadcreate.c Wed Jul 28 15:06:09 1999
@@ -199,6 +199,10 @@
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
+ if ( schedpolicy == SCHED_RR ) {
+ the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
+ }
+
/*
* This insures we evaluate the process-wide signals pending when we
* first run.
This commit is contained in:
@@ -137,6 +137,18 @@ boolean _Thread_Initialize(
|
||||
the_thread->Start.is_preemptible = is_preemptible;
|
||||
the_thread->Start.budget_algorithm = budget_algorithm;
|
||||
the_thread->Start.budget_callout = budget_callout;
|
||||
|
||||
switch ( budget_algorithm ) {
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_NONE:
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
|
||||
break;
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
|
||||
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
|
||||
break;
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
|
||||
break;
|
||||
}
|
||||
|
||||
the_thread->Start.isr_level = isr_level;
|
||||
|
||||
the_thread->current_state = STATES_DORMANT;
|
||||
|
||||
@@ -137,6 +137,18 @@ boolean _Thread_Initialize(
|
||||
the_thread->Start.is_preemptible = is_preemptible;
|
||||
the_thread->Start.budget_algorithm = budget_algorithm;
|
||||
the_thread->Start.budget_callout = budget_callout;
|
||||
|
||||
switch ( budget_algorithm ) {
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_NONE:
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
|
||||
break;
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
|
||||
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
|
||||
break;
|
||||
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
|
||||
break;
|
||||
}
|
||||
|
||||
the_thread->Start.isr_level = isr_level;
|
||||
|
||||
the_thread->current_state = STATES_DORMANT;
|
||||
|
||||
Reference in New Issue
Block a user