diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-03-21 15:01:57 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-03-22 07:05:05 +0100 |
commit | 90960bd11a91259d9aace3870692dbe2e227de0f (patch) | |
tree | 3d88f8bc3d1fe17252e8290cadae2afb4a38ce4b /cpukit/rtems/src/ratemoncancel.c | |
parent | rtems: Avoid __RTEMS_USE_TICKS_FOR_STATISTICS__ (diff) | |
download | rtems-90960bd11a91259d9aace3870692dbe2e227de0f.tar.bz2 |
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.
Diffstat (limited to '')
-rw-r--r-- | cpukit/rtems/src/ratemoncancel.c | 65 |
1 files changed, 37 insertions, 28 deletions
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 <rtems/rtems/ratemonimpl.h> -#include <rtems/score/schedulerimpl.h> -#include <rtems/score/threadimpl.h> -#include <rtems/score/watchdogimpl.h> + +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; } |