From 90960bd11a91259d9aace3870692dbe2e227de0f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 21 Mar 2016 15:01:57 +0100 Subject: rtems: Rework rate-monotonic scheduler Use the default thread lock to protect rate-monotonic state changes. This avoids use of the Giant lock. Split rtems_rate_monotonic_period() body into several static functions. Introduce a new thread wait class THREAD_WAIT_CLASS_PERIOD for period objects to synchronize the blocking operation. Close #2631. --- cpukit/rtems/src/ratemoncancel.c | 65 +++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 28 deletions(-) (limited to 'cpukit/rtems/src/ratemoncancel.c') diff --git a/cpukit/rtems/src/ratemoncancel.c b/cpukit/rtems/src/ratemoncancel.c index 2e4d5322db..af6b1ec4e3 100644 --- a/cpukit/rtems/src/ratemoncancel.c +++ b/cpukit/rtems/src/ratemoncancel.c @@ -8,6 +8,7 @@ /* * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). + * Copyright (c) 2016 embedded brains GmbH. * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -19,40 +20,48 @@ #endif #include -#include -#include -#include + +void _Rate_monotonic_Cancel( + Rate_monotonic_Control *the_period, + Thread_Control *owner, + ISR_lock_Context *lock_context +) +{ + Per_CPU_Control *cpu_self; + + _Watchdog_Per_CPU_remove_relative( &the_period->Timer ); + + owner = the_period->owner; + _Rate_monotonic_Acquire_critical( owner, lock_context ); + the_period->state = RATE_MONOTONIC_INACTIVE; + + cpu_self = _Thread_Dispatch_disable_critical( lock_context ); + _Rate_monotonic_Release( owner, lock_context ); + + _Scheduler_Release_job( owner, 0 ); + + _Thread_Dispatch_enable( cpu_self ); +} rtems_status_code rtems_rate_monotonic_cancel( rtems_id id ) { Rate_monotonic_Control *the_period; - Objects_Locations location; - ISR_Level level; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - - case OBJECTS_LOCAL: - if ( !_Thread_Is_executing( the_period->owner ) ) { - _Objects_Put( &the_period->Object ); - return RTEMS_NOT_OWNER_OF_RESOURCE; - } - _ISR_Disable( level ); - _Watchdog_Per_CPU_remove_relative( &the_period->Timer ); - _ISR_Enable( level ); - the_period->state = RATE_MONOTONIC_INACTIVE; - _Scheduler_Release_job( the_period->owner, 0 ); - _Objects_Put( &the_period->Object ); - return RTEMS_SUCCESSFUL; - -#if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: -#endif - case OBJECTS_ERROR: - break; + ISR_lock_Context lock_context; + Thread_Control *executing; + + the_period = _Rate_monotonic_Get( id, &lock_context ); + if ( the_period == NULL ) { + return RTEMS_INVALID_ID; + } + + executing = _Thread_Executing; + if ( executing != the_period->owner ) { + _ISR_lock_ISR_enable( &lock_context ); + return RTEMS_NOT_OWNER_OF_RESOURCE; } - return RTEMS_INVALID_ID; + _Rate_monotonic_Cancel( the_period, executing, &lock_context ); + return RTEMS_SUCCESSFUL; } -- cgit v1.2.3