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/ratemondelete.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 'cpukit/rtems/src/ratemondelete.c')
-rw-r--r-- | cpukit/rtems/src/ratemondelete.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/cpukit/rtems/src/ratemondelete.c b/cpukit/rtems/src/ratemondelete.c index 09b9ab6712..cb07694c1b 100644 --- a/cpukit/rtems/src/ratemondelete.c +++ b/cpukit/rtems/src/ratemondelete.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,42 +20,28 @@ #endif #include <rtems/rtems/ratemonimpl.h> -#include <rtems/score/schedulerimpl.h> -#include <rtems/score/thread.h> -#include <rtems/score/watchdogimpl.h> rtems_status_code rtems_rate_monotonic_delete( rtems_id id ) { Rate_monotonic_Control *the_period; - Objects_Locations location; - ISR_Level level; + ISR_lock_Context lock_context; + rtems_status_code status; _Objects_Allocator_lock(); - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - - case OBJECTS_LOCAL: - _Scheduler_Release_job( the_period->owner, 0 ); - _Objects_Close( &_Rate_monotonic_Information, &the_period->Object ); - _ISR_Disable( level ); - _Watchdog_Per_CPU_remove_relative( &the_period->Timer ); - _ISR_Enable( level ); - the_period->state = RATE_MONOTONIC_INACTIVE; - _Objects_Put( &the_period->Object ); - _Rate_monotonic_Free( the_period ); - _Objects_Allocator_unlock(); - return RTEMS_SUCCESSFUL; - -#if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: /* should never return this */ -#endif - case OBJECTS_ERROR: - break; + + the_period = _Rate_monotonic_Get( id, &lock_context ); + if ( the_period != NULL ) { + _Objects_Close( &_Rate_monotonic_Information, &the_period->Object ); + _Rate_monotonic_Cancel( the_period, the_period->owner, &lock_context ); + _Objects_Free( &_Rate_monotonic_Information, &the_period->Object ); + status = RTEMS_SUCCESSFUL; + } else { + status = RTEMS_INVALID_ID; } _Objects_Allocator_unlock(); - return RTEMS_INVALID_ID; + return status; } |