summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/ratemongetstatus.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/ratemongetstatus.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/ratemongetstatus.c')
-rw-r--r--cpukit/rtems/src/ratemongetstatus.c101
1 files changed, 49 insertions, 52 deletions
diff --git a/cpukit/rtems/src/ratemongetstatus.c b/cpukit/rtems/src/ratemongetstatus.c
index 29296ebca3..82a950ec6a 100644
--- a/cpukit/rtems/src/ratemongetstatus.c
+++ b/cpukit/rtems/src/ratemongetstatus.c
@@ -8,6 +8,7 @@
/*
* COPYRIGHT (c) 1989-2009.
* 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
@@ -18,72 +19,68 @@
#include "config.h"
#endif
-#include <rtems/system.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/score/isr.h>
#include <rtems/rtems/ratemonimpl.h>
-#include <rtems/score/thread.h>
-#include <rtems/score/timespec.h>
rtems_status_code rtems_rate_monotonic_get_status(
rtems_id id,
- rtems_rate_monotonic_period_status *status
+ rtems_rate_monotonic_period_status *period_status
)
{
- Timestamp_Control executed;
- Objects_Locations location;
- Timestamp_Control since_last_period;
Rate_monotonic_Control *the_period;
- bool valid_status;
+ ISR_lock_Context lock_context;
+ Thread_Control *owner;
+ rtems_status_code status;
- if ( !status )
+ if ( period_status == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
- the_period = _Rate_monotonic_Get( id, &location );
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- status->owner = the_period->owner->Object.id;
- status->state = the_period->state;
-
- /*
- * If the period is inactive, there is no information.
- */
- if ( status->state == RATE_MONOTONIC_INACTIVE ) {
- _Timespec_Set_to_zero( &status->since_last_period );
- _Timespec_Set_to_zero( &status->executed_since_last_period );
- } else {
+ the_period = _Rate_monotonic_Get( id, &lock_context );
+ if ( the_period == NULL ) {
+ return RTEMS_INVALID_ID;
+ }
- /*
- * Grab the current status.
- */
- valid_status =
- _Rate_monotonic_Get_status(
- the_period, &since_last_period, &executed
- );
- if (!valid_status) {
- _Objects_Put( &the_period->Object );
- return RTEMS_NOT_DEFINED;
- }
+ owner = the_period->owner;
+ _Rate_monotonic_Acquire_critical( owner, &lock_context );
- _Timestamp_To_timespec(
- &since_last_period, &status->since_last_period
- );
- _Timestamp_To_timespec(
- &executed, &status->executed_since_last_period
- );
- }
+ period_status->owner = owner->Object.id;
+ period_status->state = the_period->state;
- _Objects_Put( &the_period->Object );
- return RTEMS_SUCCESSFUL;
+ if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
+ /*
+ * If the period is inactive, there is no information.
+ */
+ _Timespec_Set_to_zero( &period_status->since_last_period );
+ _Timespec_Set_to_zero( &period_status->executed_since_last_period );
+ status = RTEMS_SUCCESSFUL;
+ } else {
+ Timestamp_Control wall_since_last_period;
+ Timestamp_Control cpu_since_last_period;
+ bool valid_status;
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE: /* should never return this */
-#endif
- case OBJECTS_ERROR:
- break;
+ /*
+ * Grab the current status.
+ */
+ valid_status = _Rate_monotonic_Get_status(
+ the_period,
+ &wall_since_last_period,
+ &cpu_since_last_period
+ );
+ if ( valid_status ) {
+ _Timestamp_To_timespec(
+ &wall_since_last_period,
+ &period_status->since_last_period
+ );
+ _Timestamp_To_timespec(
+ &cpu_since_last_period,
+ &period_status->executed_since_last_period
+ );
+ status = RTEMS_SUCCESSFUL;
+ } else {
+ status = RTEMS_NOT_DEFINED;
+ }
}
- return RTEMS_INVALID_ID;
+ _Rate_monotonic_Release( owner, &lock_context );
+ return status;
}