summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/ratemoncancel.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-21 15:01:57 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-22 07:05:05 +0100
commit90960bd11a91259d9aace3870692dbe2e227de0f (patch)
tree3d88f8bc3d1fe17252e8290cadae2afb4a38ce4b /cpukit/rtems/src/ratemoncancel.c
parentrtems: Avoid __RTEMS_USE_TICKS_FOR_STATISTICS__ (diff)
downloadrtems-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/ratemoncancel.c')
-rw-r--r--cpukit/rtems/src/ratemoncancel.c65
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;
}