summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/pthread.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/posix/src/pthread.c')
-rw-r--r--cpukit/posix/src/pthread.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
index ac5fbe44bf..001ae7947a 100644
--- a/cpukit/posix/src/pthread.c
+++ b/cpukit/posix/src/pthread.c
@@ -104,18 +104,15 @@ static bool _POSIX_Threads_Sporadic_budget_TSR_filter(
/*
* _POSIX_Threads_Sporadic_budget_TSR
*/
-void _POSIX_Threads_Sporadic_budget_TSR(
- Objects_Id id RTEMS_UNUSED,
- void *argument
-)
+void _POSIX_Threads_Sporadic_budget_TSR( Watchdog_Control *watchdog )
{
uint32_t ticks;
- Thread_Control *the_thread;
POSIX_API_Control *api;
+ Thread_Control *the_thread;
+ ISR_Level level;
- the_thread = argument;
-
- api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+ api = RTEMS_CONTAINER_OF( watchdog, POSIX_API_Control, Sporadic_timer );
+ the_thread = api->thread;
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
@@ -133,7 +130,15 @@ void _POSIX_Threads_Sporadic_budget_TSR(
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
- _Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
+ _Thread_Disable_dispatch();
+ _ISR_Disable( level );
+ _Watchdog_Per_CPU_insert_relative(
+ &api->Sporadic_timer,
+ _Per_CPU_Get(),
+ ticks
+ );
+ _ISR_Enable( level );
+ _Thread_Unnest_dispatch();
}
static bool _POSIX_Threads_Sporadic_budget_callout_filter(
@@ -198,6 +203,7 @@ static bool _POSIX_Threads_Create_extension(
api = created->API_Extensions[ THREAD_API_POSIX ];
/* XXX check all fields are touched */
+ api->thread = created;
_POSIX_Threads_Initialize_attributes( &api->Attributes );
api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
@@ -229,11 +235,10 @@ static bool _POSIX_Threads_Create_extension(
_Thread_queue_Initialize( &api->Join_List, THREAD_QUEUE_DISCIPLINE_FIFO );
+ _Watchdog_Preinitialize( &api->Sporadic_timer, _Per_CPU_Get_by_index( 0 ) );
_Watchdog_Initialize(
&api->Sporadic_timer,
- _POSIX_Threads_Sporadic_budget_TSR,
- created->Object.id,
- created
+ _POSIX_Threads_Sporadic_budget_TSR
);
return true;
@@ -260,7 +265,7 @@ static void _POSIX_Threads_Terminate_extension(
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
- _Watchdog_Remove_ticks( &api->Sporadic_timer );
+ _Watchdog_Per_CPU_remove_relative( &api->Sporadic_timer );
_Thread_queue_Destroy( &api->Join_List );