diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-02-18 08:36:26 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-03-04 13:36:10 +0100 |
commit | 03b900d3ed120ea919ea3eded7edbece3488cff3 (patch) | |
tree | 182781fc14fe15fd67caeb80e46f1c58495839c2 /cpukit/score/include/rtems/score/mrspimpl.h | |
parent | score: Distribute clock tick to all online CPUs (diff) | |
download | rtems-03b900d3ed120ea919ea3eded7edbece3488cff3.tar.bz2 |
score: Replace watchdog handler implementation
Use a red-black tree instead of delta chains.
Close #2344.
Update #2554.
Update #2555.
Close #2606.
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/include/rtems/score/mrspimpl.h | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/cpukit/score/include/rtems/score/mrspimpl.h b/cpukit/score/include/rtems/score/mrspimpl.h index bc9ed4b511..7638fb5975 100644 --- a/cpukit/score/include/rtems/score/mrspimpl.h +++ b/cpukit/score/include/rtems/score/mrspimpl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015 embedded brains GmbH. All rights reserved. + * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -159,18 +159,13 @@ RTEMS_INLINE_ROUTINE void _MRSP_Set_ceiling_priority( mrsp->ceiling_priorities[ scheduler_index ] = ceiling_priority; } -RTEMS_INLINE_ROUTINE void _MRSP_Timeout( - Objects_Id id, - void *arg -) +RTEMS_INLINE_ROUTINE void _MRSP_Timeout( Watchdog_Control *watchdog ) { - MRSP_Rival *rival = arg; + MRSP_Rival *rival = RTEMS_CONTAINER_OF( watchdog, MRSP_Rival, Watchdog ); MRSP_Control *mrsp = rival->resource; Thread_Control *thread = rival->thread; ISR_lock_Context lock_context; - (void) id; - _ISR_lock_ISR_disable_and_acquire( &mrsp->Lock, &lock_context ); if ( rival->status == MRSP_WAIT_FOR_OWNERSHIP ) { @@ -209,6 +204,7 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Wait_for_ownership( bool initial_life_protection; Per_CPU_Control *cpu_self; ISR_lock_Context giant_lock_context; + ISR_Level level; rival.thread = executing; rival.resource = mrsp; @@ -236,13 +232,11 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Wait_for_ownership( _Thread_Raise_priority( executing, ceiling_priority ); if ( timeout > 0 ) { - _Watchdog_Initialize( - &executing->Timer, - _MRSP_Timeout, - 0, - &rival - ); - _Watchdog_Insert_ticks( &executing->Timer, timeout ); + _Watchdog_Preinitialize( &rival.Watchdog, cpu_self ); + _Watchdog_Initialize( &rival.Watchdog, _MRSP_Timeout ); + _ISR_Disable_without_giant( level ); + _Watchdog_Per_CPU_insert_relative( &rival.Watchdog, cpu_self, timeout ); + _ISR_Enable_without_giant( level ); } initial_life_protection = _Thread_Set_life_protection( true ); @@ -258,7 +252,13 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Wait_for_ownership( _Thread_Set_life_protection( initial_life_protection ); if ( timeout > 0 ) { - _Watchdog_Remove_ticks( &executing->Timer ); + _ISR_Disable_without_giant( level ); + _Watchdog_Per_CPU_remove( + &rival.Watchdog, + cpu_self, + &cpu_self->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ] + ); + _ISR_Enable_without_giant( level ); if ( status == MRSP_TIMEOUT ) { _MRSP_Restore_priority( executing, initial_priority ); |