From 5f9b3db545887fd328d006e33f1dca295584bc6f Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 17 May 1999 23:03:07 +0000 Subject: Split Rate Monotonic Manager into one routine per file. --- c/src/exec/rtems/src/Makefile.in | 6 +- c/src/exec/rtems/src/ratemon.c | 416 -------------------------------- c/src/exec/rtems/src/ratemoncancel.c | 65 +++++ c/src/exec/rtems/src/ratemoncreate.c | 68 ++++++ c/src/exec/rtems/src/ratemondelete.c | 63 +++++ c/src/exec/rtems/src/ratemongetstatus.c | 80 ++++++ c/src/exec/rtems/src/ratemonident.c | 56 +++++ c/src/exec/rtems/src/ratemonperiod.c | 159 ++++++++++++ c/src/exec/rtems/src/ratemontimeout.c | 77 ++++++ cpukit/rtems/src/ratemon.c | 416 -------------------------------- cpukit/rtems/src/ratemoncancel.c | 65 +++++ cpukit/rtems/src/ratemoncreate.c | 68 ++++++ cpukit/rtems/src/ratemondelete.c | 63 +++++ cpukit/rtems/src/ratemongetstatus.c | 80 ++++++ cpukit/rtems/src/ratemonident.c | 56 +++++ cpukit/rtems/src/ratemonperiod.c | 159 ++++++++++++ cpukit/rtems/src/ratemontimeout.c | 77 ++++++ 17 files changed, 1141 insertions(+), 833 deletions(-) create mode 100644 c/src/exec/rtems/src/ratemoncancel.c create mode 100644 c/src/exec/rtems/src/ratemoncreate.c create mode 100644 c/src/exec/rtems/src/ratemondelete.c create mode 100644 c/src/exec/rtems/src/ratemongetstatus.c create mode 100644 c/src/exec/rtems/src/ratemonident.c create mode 100644 c/src/exec/rtems/src/ratemonperiod.c create mode 100644 c/src/exec/rtems/src/ratemontimeout.c create mode 100644 cpukit/rtems/src/ratemoncancel.c create mode 100644 cpukit/rtems/src/ratemoncreate.c create mode 100644 cpukit/rtems/src/ratemondelete.c create mode 100644 cpukit/rtems/src/ratemongetstatus.c create mode 100644 cpukit/rtems/src/ratemonident.c create mode 100644 cpukit/rtems/src/ratemonperiod.c create mode 100644 cpukit/rtems/src/ratemontimeout.c diff --git a/c/src/exec/rtems/src/Makefile.in b/c/src/exec/rtems/src/Makefile.in index b16c849ecc..79057f5e47 100644 --- a/c/src/exec/rtems/src/Makefile.in +++ b/c/src/exec/rtems/src/Makefile.in @@ -40,9 +40,13 @@ SEMAPHORE_PIECES=\ sem semcreate semdelete semident semobtain semrelease \ semtranslatereturncode +RATEMON_PIECES=\ + ratemon ratemoncancel ratemoncreate ratemondelete ratemongetstatus \ + ratemonident ratemonperiod ratemontimeout + C_PIECES=attr $(CLOCK_PIECES) dpmem event intr intrbody \ $(MESSAGE_QUEUE_PIECES) \ - part ratemon $(REGION_PIECES) $(SEMAPHORE_PIECES) signal \ + part $(RATEMON_PIECES) $(REGION_PIECES) $(SEMAPHORE_PIECES) signal \ $(TASK_PIECES) timer $(MP_PIECES) C_FILES=$(C_PIECES:%=%.c) C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) diff --git a/c/src/exec/rtems/src/ratemon.c b/c/src/exec/rtems/src/ratemon.c index 6832aac593..5df26ee608 100644 --- a/c/src/exec/rtems/src/ratemon.c +++ b/c/src/exec/rtems/src/ratemon.c @@ -52,419 +52,3 @@ void _Rate_monotonic_Manager_initialization( FALSE ); } - -/*PAGE - * - * rtems_rate_monotonic_create - * - * This directive creates a rate monotonic timer and performs - * some initialization. - * - * Input parameters: - * name - name of period - * id - pointer to rate monotonic id - * - * Output parameters: - * id - rate monotonic id - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_create( - rtems_name name, - Objects_Id *id -) -{ - Rate_monotonic_Control *the_period; - - if ( !rtems_is_name_valid( name ) ) - return RTEMS_INVALID_NAME; - - _Thread_Disable_dispatch(); /* to prevent deletion */ - - the_period = _Rate_monotonic_Allocate(); - - if ( !the_period ) { - _Thread_Enable_dispatch(); - return RTEMS_TOO_MANY; - } - - the_period->owner = _Thread_Executing; - the_period->state = RATE_MONOTONIC_INACTIVE; - - _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, &name ); - - *id = the_period->Object.id; - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; -} - -/*PAGE - * - * rtems_rate_monotonic_ident - * - * This directive returns the system ID associated with - * the rate monotonic period name. - * - * Input parameters: - * name - user defined period name - * id - pointer to period id - * - * Output parameters: - * *id - region id - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_ident( - rtems_name name, - Objects_Id *id -) -{ - Objects_Name_to_id_errors status; - - status = _Objects_Name_to_id( - &_Rate_monotonic_Information, - &name, - OBJECTS_SEARCH_LOCAL_NODE, - id - ); - - return _Status_Object_name_errors_to_status[ status ]; -} - -/*PAGE - * - * rtems_rate_monotonic_cancel - * - * This directive allows a thread to cancel a rate monotonic timer. - * - * Input parameters: - * id - rate monotonic id - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful and caller is not the owning thread - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_cancel( - Objects_Id id -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: - return RTEMS_INTERNAL_ERROR; /* should never return this */ - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - if ( !_Thread_Is_executing( the_period->owner ) ) { - _Thread_Enable_dispatch(); - return RTEMS_NOT_OWNER_OF_RESOURCE; - } - (void) _Watchdog_Remove( &the_period->Timer ); - the_period->state = RATE_MONOTONIC_INACTIVE; - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - -/*PAGE - * - * rtems_rate_monotonic_delete - * - * This directive allows a thread to delete a rate monotonic timer. - * - * Input parameters: - * id - rate monotonic id - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_delete( - Objects_Id id -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* should never return this */ - return RTEMS_INTERNAL_ERROR; - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - _Objects_Close( &_Rate_monotonic_Information, &the_period->Object ); - (void) _Watchdog_Remove( &the_period->Timer ); - the_period->state = RATE_MONOTONIC_INACTIVE; - _Rate_monotonic_Free( the_period ); - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - -/*PAGE - * - * rtems_rate_monotonic_get_status - * - * This directive allows a thread to obtain status information on a - * period. - * - * Input parameters: - * id - rate monotonic id - * status - pointer to status control block - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - * - */ - -rtems_status_code rtems_rate_monotonic_get_status( - Objects_Id id, - rtems_rate_monotonic_period_status *status -) -{ - Objects_Locations location; - Rate_monotonic_Control *the_period; - - if ( status == NULL ) - return RTEMS_INVALID_ADDRESS; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* should never return this */ - return RTEMS_INTERNAL_ERROR; - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - status->state = the_period->state; - - if ( status->state == RATE_MONOTONIC_INACTIVE ) { - status->ticks_since_last_period = 0; - status->ticks_executed_since_last_period = 0; - } else { - status->ticks_since_last_period = - _Watchdog_Ticks_since_boot - the_period->time_at_period; - - status->ticks_executed_since_last_period = - the_period->owner->ticks_executed - - the_period->owner_ticks_executed_at_period; - } - - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - - -/*PAGE - * - * rtems_rate_monotonic_period - * - * This directive allows a thread to manipulate a rate monotonic timer. - * - * Input parameters: - * id - rate monotonic id - * length - length of period (in ticks) - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_period( - Objects_Id id, - rtems_interval length -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - rtems_status_code return_value; - rtems_rate_monotonic_period_states local_state; - ISR_Level level; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* should never return this */ - return RTEMS_INTERNAL_ERROR; - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - if ( !_Thread_Is_executing( the_period->owner ) ) { - _Thread_Enable_dispatch(); - return RTEMS_NOT_OWNER_OF_RESOURCE; - } - - if ( length == RTEMS_PERIOD_STATUS ) { - switch ( the_period->state ) { - case RATE_MONOTONIC_INACTIVE: - return_value = RTEMS_NOT_DEFINED; - break; - case RATE_MONOTONIC_ACTIVE: - return_value = RTEMS_SUCCESSFUL; - break; - case RATE_MONOTONIC_EXPIRED: - return_value = RTEMS_TIMEOUT; - break; - default: /* unreached -- only to remove warnings */ - return_value = RTEMS_INTERNAL_ERROR; - break; - } - _Thread_Enable_dispatch(); - return( return_value ); - } - - _ISR_Disable( level ); - switch ( the_period->state ) { - case RATE_MONOTONIC_INACTIVE: - _ISR_Enable( level ); - the_period->state = RATE_MONOTONIC_ACTIVE; - _Watchdog_Initialize( - &the_period->Timer, - _Rate_monotonic_Timeout, - id, - NULL - ); - - the_period->owner_ticks_executed_at_period = - _Thread_Executing->ticks_executed; - - the_period->time_at_period = _Watchdog_Ticks_since_boot; - - _Watchdog_Insert_ticks( &the_period->Timer, length ); - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - - case RATE_MONOTONIC_ACTIVE: - /* - * This tells the _Rate_monotonic_Timeout that this task is - * in the process of blocking on the period. - */ - - the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; - _ISR_Enable( level ); - - _Thread_Executing->Wait.id = the_period->Object.id; - _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); - - /* - * Did the watchdog timer expire while we were actually blocking - * on it? - */ - - _ISR_Disable( level ); - local_state = the_period->state; - the_period->state = RATE_MONOTONIC_ACTIVE; - _ISR_Enable( level ); - - /* - * If it did, then we want to unblock ourself and continue as - * if nothing happen. The period was reset in the timeout routine. - */ - - if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING ) - _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); - - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - break; - - case RATE_MONOTONIC_EXPIRED: - _ISR_Enable( level ); - the_period->state = RATE_MONOTONIC_ACTIVE; - the_period->owner_ticks_executed_at_period = - _Thread_Executing->ticks_executed; - the_period->time_at_period = _Watchdog_Ticks_since_boot; - - _Watchdog_Insert_ticks( &the_period->Timer, length ); - _Thread_Enable_dispatch(); - return RTEMS_TIMEOUT; - - case RATE_MONOTONIC_OWNER_IS_BLOCKING: - case RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING: - /* - * These should never happen. - */ - break; - } - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - -/*PAGE - * - * _Rate_monotonic_Timeout - * - * This routine processes a period ending. If the owning thread - * is waiting for the period, that thread is unblocked and the - * period reinitiated. Otherwise, the period is expired. - * This routine is called by the watchdog handler. - * - * Input parameters: - * id - period id - * - * Output parameters: NONE - */ - -void _Rate_monotonic_Timeout( - Objects_Id id, - void *ignored -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - Thread_Control *the_thread; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* impossible */ - case OBJECTS_ERROR: - break; - - case OBJECTS_LOCAL: - the_thread = the_period->owner; - if ( _States_Is_waiting_for_period( the_thread->current_state ) && - the_thread->Wait.id == the_period->Object.id ) { - _Thread_Unblock( the_thread ); - the_period->owner_ticks_executed_at_period = - the_thread->ticks_executed; - - the_period->time_at_period = _Watchdog_Ticks_since_boot; - - _Watchdog_Reset( &the_period->Timer ); - } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { - the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; - the_period->owner_ticks_executed_at_period = - the_thread->ticks_executed; - - the_period->time_at_period = _Watchdog_Ticks_since_boot; - _Watchdog_Reset( &the_period->Timer ); - } else - the_period->state = RATE_MONOTONIC_EXPIRED; - _Thread_Unnest_dispatch(); - break; - } -} - diff --git a/c/src/exec/rtems/src/ratemoncancel.c b/c/src/exec/rtems/src/ratemoncancel.c new file mode 100644 index 0000000000..0bc3fc6fc3 --- /dev/null +++ b/c/src/exec/rtems/src/ratemoncancel.c @@ -0,0 +1,65 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_cancel + * + * This directive allows a thread to cancel a rate monotonic timer. + * + * Input parameters: + * id - rate monotonic id + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful and caller is not the owning thread + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_cancel( + Objects_Id id +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: + return RTEMS_INTERNAL_ERROR; /* should never return this */ + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + if ( !_Thread_Is_executing( the_period->owner ) ) { + _Thread_Enable_dispatch(); + return RTEMS_NOT_OWNER_OF_RESOURCE; + } + (void) _Watchdog_Remove( &the_period->Timer ); + the_period->state = RATE_MONOTONIC_INACTIVE; + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/c/src/exec/rtems/src/ratemoncreate.c b/c/src/exec/rtems/src/ratemoncreate.c new file mode 100644 index 0000000000..413da155eb --- /dev/null +++ b/c/src/exec/rtems/src/ratemoncreate.c @@ -0,0 +1,68 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_create + * + * This directive creates a rate monotonic timer and performs + * some initialization. + * + * Input parameters: + * name - name of period + * id - pointer to rate monotonic id + * + * Output parameters: + * id - rate monotonic id + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_create( + rtems_name name, + Objects_Id *id +) +{ + Rate_monotonic_Control *the_period; + + if ( !rtems_is_name_valid( name ) ) + return RTEMS_INVALID_NAME; + + _Thread_Disable_dispatch(); /* to prevent deletion */ + + the_period = _Rate_monotonic_Allocate(); + + if ( !the_period ) { + _Thread_Enable_dispatch(); + return RTEMS_TOO_MANY; + } + + the_period->owner = _Thread_Executing; + the_period->state = RATE_MONOTONIC_INACTIVE; + + _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, &name ); + + *id = the_period->Object.id; + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/exec/rtems/src/ratemondelete.c b/c/src/exec/rtems/src/ratemondelete.c new file mode 100644 index 0000000000..08d304c75a --- /dev/null +++ b/c/src/exec/rtems/src/ratemondelete.c @@ -0,0 +1,63 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_delete + * + * This directive allows a thread to delete a rate monotonic timer. + * + * Input parameters: + * id - rate monotonic id + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_delete( + Objects_Id id +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* should never return this */ + return RTEMS_INTERNAL_ERROR; + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + _Objects_Close( &_Rate_monotonic_Information, &the_period->Object ); + (void) _Watchdog_Remove( &the_period->Timer ); + the_period->state = RATE_MONOTONIC_INACTIVE; + _Rate_monotonic_Free( the_period ); + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/c/src/exec/rtems/src/ratemongetstatus.c b/c/src/exec/rtems/src/ratemongetstatus.c new file mode 100644 index 0000000000..4a05a93ca6 --- /dev/null +++ b/c/src/exec/rtems/src/ratemongetstatus.c @@ -0,0 +1,80 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_get_status + * + * This directive allows a thread to obtain status information on a + * period. + * + * Input parameters: + * id - rate monotonic id + * status - pointer to status control block + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + * + */ + +rtems_status_code rtems_rate_monotonic_get_status( + Objects_Id id, + rtems_rate_monotonic_period_status *status +) +{ + Objects_Locations location; + Rate_monotonic_Control *the_period; + + if ( status == NULL ) + return RTEMS_INVALID_ADDRESS; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* should never return this */ + return RTEMS_INTERNAL_ERROR; + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + status->state = the_period->state; + + if ( status->state == RATE_MONOTONIC_INACTIVE ) { + status->ticks_since_last_period = 0; + status->ticks_executed_since_last_period = 0; + } else { + status->ticks_since_last_period = + _Watchdog_Ticks_since_boot - the_period->time_at_period; + + status->ticks_executed_since_last_period = + the_period->owner->ticks_executed - + the_period->owner_ticks_executed_at_period; + } + + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/c/src/exec/rtems/src/ratemonident.c b/c/src/exec/rtems/src/ratemonident.c new file mode 100644 index 0000000000..0dba33504a --- /dev/null +++ b/c/src/exec/rtems/src/ratemonident.c @@ -0,0 +1,56 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_ident + * + * This directive returns the system ID associated with + * the rate monotonic period name. + * + * Input parameters: + * name - user defined period name + * id - pointer to period id + * + * Output parameters: + * *id - region id + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_ident( + rtems_name name, + Objects_Id *id +) +{ + Objects_Name_to_id_errors status; + + status = _Objects_Name_to_id( + &_Rate_monotonic_Information, + &name, + OBJECTS_SEARCH_LOCAL_NODE, + id + ); + + return _Status_Object_name_errors_to_status[ status ]; +} diff --git a/c/src/exec/rtems/src/ratemonperiod.c b/c/src/exec/rtems/src/ratemonperiod.c new file mode 100644 index 0000000000..95a09c453e --- /dev/null +++ b/c/src/exec/rtems/src/ratemonperiod.c @@ -0,0 +1,159 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_period + * + * This directive allows a thread to manipulate a rate monotonic timer. + * + * Input parameters: + * id - rate monotonic id + * length - length of period (in ticks) + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_period( + Objects_Id id, + rtems_interval length +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + rtems_status_code return_value; + rtems_rate_monotonic_period_states local_state; + ISR_Level level; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* should never return this */ + return RTEMS_INTERNAL_ERROR; + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + if ( !_Thread_Is_executing( the_period->owner ) ) { + _Thread_Enable_dispatch(); + return RTEMS_NOT_OWNER_OF_RESOURCE; + } + + if ( length == RTEMS_PERIOD_STATUS ) { + switch ( the_period->state ) { + case RATE_MONOTONIC_INACTIVE: + return_value = RTEMS_NOT_DEFINED; + break; + case RATE_MONOTONIC_ACTIVE: + return_value = RTEMS_SUCCESSFUL; + break; + case RATE_MONOTONIC_EXPIRED: + return_value = RTEMS_TIMEOUT; + break; + default: /* unreached -- only to remove warnings */ + return_value = RTEMS_INTERNAL_ERROR; + break; + } + _Thread_Enable_dispatch(); + return( return_value ); + } + + _ISR_Disable( level ); + switch ( the_period->state ) { + case RATE_MONOTONIC_INACTIVE: + _ISR_Enable( level ); + the_period->state = RATE_MONOTONIC_ACTIVE; + _Watchdog_Initialize( + &the_period->Timer, + _Rate_monotonic_Timeout, + id, + NULL + ); + + the_period->owner_ticks_executed_at_period = + _Thread_Executing->ticks_executed; + + the_period->time_at_period = _Watchdog_Ticks_since_boot; + + _Watchdog_Insert_ticks( &the_period->Timer, length ); + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + + case RATE_MONOTONIC_ACTIVE: + /* + * This tells the _Rate_monotonic_Timeout that this task is + * in the process of blocking on the period. + */ + + the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; + _ISR_Enable( level ); + + _Thread_Executing->Wait.id = the_period->Object.id; + _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); + + /* + * Did the watchdog timer expire while we were actually blocking + * on it? + */ + + _ISR_Disable( level ); + local_state = the_period->state; + the_period->state = RATE_MONOTONIC_ACTIVE; + _ISR_Enable( level ); + + /* + * If it did, then we want to unblock ourself and continue as + * if nothing happen. The period was reset in the timeout routine. + */ + + if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING ) + _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); + + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + break; + + case RATE_MONOTONIC_EXPIRED: + _ISR_Enable( level ); + the_period->state = RATE_MONOTONIC_ACTIVE; + the_period->owner_ticks_executed_at_period = + _Thread_Executing->ticks_executed; + the_period->time_at_period = _Watchdog_Ticks_since_boot; + + _Watchdog_Insert_ticks( &the_period->Timer, length ); + _Thread_Enable_dispatch(); + return RTEMS_TIMEOUT; + + case RATE_MONOTONIC_OWNER_IS_BLOCKING: + case RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING: + /* + * These should never happen. + */ + break; + } + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/c/src/exec/rtems/src/ratemontimeout.c b/c/src/exec/rtems/src/ratemontimeout.c new file mode 100644 index 0000000000..6c8a1976f4 --- /dev/null +++ b/c/src/exec/rtems/src/ratemontimeout.c @@ -0,0 +1,77 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * _Rate_monotonic_Timeout + * + * This routine processes a period ending. If the owning thread + * is waiting for the period, that thread is unblocked and the + * period reinitiated. Otherwise, the period is expired. + * This routine is called by the watchdog handler. + * + * Input parameters: + * id - period id + * + * Output parameters: NONE + */ + +void _Rate_monotonic_Timeout( + Objects_Id id, + void *ignored +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + Thread_Control *the_thread; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* impossible */ + case OBJECTS_ERROR: + break; + + case OBJECTS_LOCAL: + the_thread = the_period->owner; + if ( _States_Is_waiting_for_period( the_thread->current_state ) && + the_thread->Wait.id == the_period->Object.id ) { + _Thread_Unblock( the_thread ); + the_period->owner_ticks_executed_at_period = + the_thread->ticks_executed; + + the_period->time_at_period = _Watchdog_Ticks_since_boot; + + _Watchdog_Reset( &the_period->Timer ); + } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { + the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; + the_period->owner_ticks_executed_at_period = + the_thread->ticks_executed; + + the_period->time_at_period = _Watchdog_Ticks_since_boot; + _Watchdog_Reset( &the_period->Timer ); + } else + the_period->state = RATE_MONOTONIC_EXPIRED; + _Thread_Unnest_dispatch(); + break; + } +} diff --git a/cpukit/rtems/src/ratemon.c b/cpukit/rtems/src/ratemon.c index 6832aac593..5df26ee608 100644 --- a/cpukit/rtems/src/ratemon.c +++ b/cpukit/rtems/src/ratemon.c @@ -52,419 +52,3 @@ void _Rate_monotonic_Manager_initialization( FALSE ); } - -/*PAGE - * - * rtems_rate_monotonic_create - * - * This directive creates a rate monotonic timer and performs - * some initialization. - * - * Input parameters: - * name - name of period - * id - pointer to rate monotonic id - * - * Output parameters: - * id - rate monotonic id - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_create( - rtems_name name, - Objects_Id *id -) -{ - Rate_monotonic_Control *the_period; - - if ( !rtems_is_name_valid( name ) ) - return RTEMS_INVALID_NAME; - - _Thread_Disable_dispatch(); /* to prevent deletion */ - - the_period = _Rate_monotonic_Allocate(); - - if ( !the_period ) { - _Thread_Enable_dispatch(); - return RTEMS_TOO_MANY; - } - - the_period->owner = _Thread_Executing; - the_period->state = RATE_MONOTONIC_INACTIVE; - - _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, &name ); - - *id = the_period->Object.id; - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; -} - -/*PAGE - * - * rtems_rate_monotonic_ident - * - * This directive returns the system ID associated with - * the rate monotonic period name. - * - * Input parameters: - * name - user defined period name - * id - pointer to period id - * - * Output parameters: - * *id - region id - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_ident( - rtems_name name, - Objects_Id *id -) -{ - Objects_Name_to_id_errors status; - - status = _Objects_Name_to_id( - &_Rate_monotonic_Information, - &name, - OBJECTS_SEARCH_LOCAL_NODE, - id - ); - - return _Status_Object_name_errors_to_status[ status ]; -} - -/*PAGE - * - * rtems_rate_monotonic_cancel - * - * This directive allows a thread to cancel a rate monotonic timer. - * - * Input parameters: - * id - rate monotonic id - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful and caller is not the owning thread - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_cancel( - Objects_Id id -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: - return RTEMS_INTERNAL_ERROR; /* should never return this */ - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - if ( !_Thread_Is_executing( the_period->owner ) ) { - _Thread_Enable_dispatch(); - return RTEMS_NOT_OWNER_OF_RESOURCE; - } - (void) _Watchdog_Remove( &the_period->Timer ); - the_period->state = RATE_MONOTONIC_INACTIVE; - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - -/*PAGE - * - * rtems_rate_monotonic_delete - * - * This directive allows a thread to delete a rate monotonic timer. - * - * Input parameters: - * id - rate monotonic id - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_delete( - Objects_Id id -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* should never return this */ - return RTEMS_INTERNAL_ERROR; - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - _Objects_Close( &_Rate_monotonic_Information, &the_period->Object ); - (void) _Watchdog_Remove( &the_period->Timer ); - the_period->state = RATE_MONOTONIC_INACTIVE; - _Rate_monotonic_Free( the_period ); - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - -/*PAGE - * - * rtems_rate_monotonic_get_status - * - * This directive allows a thread to obtain status information on a - * period. - * - * Input parameters: - * id - rate monotonic id - * status - pointer to status control block - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - * - */ - -rtems_status_code rtems_rate_monotonic_get_status( - Objects_Id id, - rtems_rate_monotonic_period_status *status -) -{ - Objects_Locations location; - Rate_monotonic_Control *the_period; - - if ( status == NULL ) - return RTEMS_INVALID_ADDRESS; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* should never return this */ - return RTEMS_INTERNAL_ERROR; - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - status->state = the_period->state; - - if ( status->state == RATE_MONOTONIC_INACTIVE ) { - status->ticks_since_last_period = 0; - status->ticks_executed_since_last_period = 0; - } else { - status->ticks_since_last_period = - _Watchdog_Ticks_since_boot - the_period->time_at_period; - - status->ticks_executed_since_last_period = - the_period->owner->ticks_executed - - the_period->owner_ticks_executed_at_period; - } - - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - - -/*PAGE - * - * rtems_rate_monotonic_period - * - * This directive allows a thread to manipulate a rate monotonic timer. - * - * Input parameters: - * id - rate monotonic id - * length - length of period (in ticks) - * - * Output parameters: - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - -rtems_status_code rtems_rate_monotonic_period( - Objects_Id id, - rtems_interval length -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - rtems_status_code return_value; - rtems_rate_monotonic_period_states local_state; - ISR_Level level; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* should never return this */ - return RTEMS_INTERNAL_ERROR; - - case OBJECTS_ERROR: - return RTEMS_INVALID_ID; - - case OBJECTS_LOCAL: - if ( !_Thread_Is_executing( the_period->owner ) ) { - _Thread_Enable_dispatch(); - return RTEMS_NOT_OWNER_OF_RESOURCE; - } - - if ( length == RTEMS_PERIOD_STATUS ) { - switch ( the_period->state ) { - case RATE_MONOTONIC_INACTIVE: - return_value = RTEMS_NOT_DEFINED; - break; - case RATE_MONOTONIC_ACTIVE: - return_value = RTEMS_SUCCESSFUL; - break; - case RATE_MONOTONIC_EXPIRED: - return_value = RTEMS_TIMEOUT; - break; - default: /* unreached -- only to remove warnings */ - return_value = RTEMS_INTERNAL_ERROR; - break; - } - _Thread_Enable_dispatch(); - return( return_value ); - } - - _ISR_Disable( level ); - switch ( the_period->state ) { - case RATE_MONOTONIC_INACTIVE: - _ISR_Enable( level ); - the_period->state = RATE_MONOTONIC_ACTIVE; - _Watchdog_Initialize( - &the_period->Timer, - _Rate_monotonic_Timeout, - id, - NULL - ); - - the_period->owner_ticks_executed_at_period = - _Thread_Executing->ticks_executed; - - the_period->time_at_period = _Watchdog_Ticks_since_boot; - - _Watchdog_Insert_ticks( &the_period->Timer, length ); - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - - case RATE_MONOTONIC_ACTIVE: - /* - * This tells the _Rate_monotonic_Timeout that this task is - * in the process of blocking on the period. - */ - - the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; - _ISR_Enable( level ); - - _Thread_Executing->Wait.id = the_period->Object.id; - _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); - - /* - * Did the watchdog timer expire while we were actually blocking - * on it? - */ - - _ISR_Disable( level ); - local_state = the_period->state; - the_period->state = RATE_MONOTONIC_ACTIVE; - _ISR_Enable( level ); - - /* - * If it did, then we want to unblock ourself and continue as - * if nothing happen. The period was reset in the timeout routine. - */ - - if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING ) - _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); - - _Thread_Enable_dispatch(); - return RTEMS_SUCCESSFUL; - break; - - case RATE_MONOTONIC_EXPIRED: - _ISR_Enable( level ); - the_period->state = RATE_MONOTONIC_ACTIVE; - the_period->owner_ticks_executed_at_period = - _Thread_Executing->ticks_executed; - the_period->time_at_period = _Watchdog_Ticks_since_boot; - - _Watchdog_Insert_ticks( &the_period->Timer, length ); - _Thread_Enable_dispatch(); - return RTEMS_TIMEOUT; - - case RATE_MONOTONIC_OWNER_IS_BLOCKING: - case RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING: - /* - * These should never happen. - */ - break; - } - } - - return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ -} - -/*PAGE - * - * _Rate_monotonic_Timeout - * - * This routine processes a period ending. If the owning thread - * is waiting for the period, that thread is unblocked and the - * period reinitiated. Otherwise, the period is expired. - * This routine is called by the watchdog handler. - * - * Input parameters: - * id - period id - * - * Output parameters: NONE - */ - -void _Rate_monotonic_Timeout( - Objects_Id id, - void *ignored -) -{ - Rate_monotonic_Control *the_period; - Objects_Locations location; - Thread_Control *the_thread; - - the_period = _Rate_monotonic_Get( id, &location ); - switch ( location ) { - case OBJECTS_REMOTE: /* impossible */ - case OBJECTS_ERROR: - break; - - case OBJECTS_LOCAL: - the_thread = the_period->owner; - if ( _States_Is_waiting_for_period( the_thread->current_state ) && - the_thread->Wait.id == the_period->Object.id ) { - _Thread_Unblock( the_thread ); - the_period->owner_ticks_executed_at_period = - the_thread->ticks_executed; - - the_period->time_at_period = _Watchdog_Ticks_since_boot; - - _Watchdog_Reset( &the_period->Timer ); - } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { - the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; - the_period->owner_ticks_executed_at_period = - the_thread->ticks_executed; - - the_period->time_at_period = _Watchdog_Ticks_since_boot; - _Watchdog_Reset( &the_period->Timer ); - } else - the_period->state = RATE_MONOTONIC_EXPIRED; - _Thread_Unnest_dispatch(); - break; - } -} - diff --git a/cpukit/rtems/src/ratemoncancel.c b/cpukit/rtems/src/ratemoncancel.c new file mode 100644 index 0000000000..0bc3fc6fc3 --- /dev/null +++ b/cpukit/rtems/src/ratemoncancel.c @@ -0,0 +1,65 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_cancel + * + * This directive allows a thread to cancel a rate monotonic timer. + * + * Input parameters: + * id - rate monotonic id + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful and caller is not the owning thread + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_cancel( + Objects_Id id +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: + return RTEMS_INTERNAL_ERROR; /* should never return this */ + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + if ( !_Thread_Is_executing( the_period->owner ) ) { + _Thread_Enable_dispatch(); + return RTEMS_NOT_OWNER_OF_RESOURCE; + } + (void) _Watchdog_Remove( &the_period->Timer ); + the_period->state = RATE_MONOTONIC_INACTIVE; + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/cpukit/rtems/src/ratemoncreate.c b/cpukit/rtems/src/ratemoncreate.c new file mode 100644 index 0000000000..413da155eb --- /dev/null +++ b/cpukit/rtems/src/ratemoncreate.c @@ -0,0 +1,68 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_create + * + * This directive creates a rate monotonic timer and performs + * some initialization. + * + * Input parameters: + * name - name of period + * id - pointer to rate monotonic id + * + * Output parameters: + * id - rate monotonic id + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_create( + rtems_name name, + Objects_Id *id +) +{ + Rate_monotonic_Control *the_period; + + if ( !rtems_is_name_valid( name ) ) + return RTEMS_INVALID_NAME; + + _Thread_Disable_dispatch(); /* to prevent deletion */ + + the_period = _Rate_monotonic_Allocate(); + + if ( !the_period ) { + _Thread_Enable_dispatch(); + return RTEMS_TOO_MANY; + } + + the_period->owner = _Thread_Executing; + the_period->state = RATE_MONOTONIC_INACTIVE; + + _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, &name ); + + *id = the_period->Object.id; + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; +} diff --git a/cpukit/rtems/src/ratemondelete.c b/cpukit/rtems/src/ratemondelete.c new file mode 100644 index 0000000000..08d304c75a --- /dev/null +++ b/cpukit/rtems/src/ratemondelete.c @@ -0,0 +1,63 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_delete + * + * This directive allows a thread to delete a rate monotonic timer. + * + * Input parameters: + * id - rate monotonic id + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_delete( + Objects_Id id +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* should never return this */ + return RTEMS_INTERNAL_ERROR; + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + _Objects_Close( &_Rate_monotonic_Information, &the_period->Object ); + (void) _Watchdog_Remove( &the_period->Timer ); + the_period->state = RATE_MONOTONIC_INACTIVE; + _Rate_monotonic_Free( the_period ); + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/cpukit/rtems/src/ratemongetstatus.c b/cpukit/rtems/src/ratemongetstatus.c new file mode 100644 index 0000000000..4a05a93ca6 --- /dev/null +++ b/cpukit/rtems/src/ratemongetstatus.c @@ -0,0 +1,80 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_get_status + * + * This directive allows a thread to obtain status information on a + * period. + * + * Input parameters: + * id - rate monotonic id + * status - pointer to status control block + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + * + */ + +rtems_status_code rtems_rate_monotonic_get_status( + Objects_Id id, + rtems_rate_monotonic_period_status *status +) +{ + Objects_Locations location; + Rate_monotonic_Control *the_period; + + if ( status == NULL ) + return RTEMS_INVALID_ADDRESS; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* should never return this */ + return RTEMS_INTERNAL_ERROR; + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + status->state = the_period->state; + + if ( status->state == RATE_MONOTONIC_INACTIVE ) { + status->ticks_since_last_period = 0; + status->ticks_executed_since_last_period = 0; + } else { + status->ticks_since_last_period = + _Watchdog_Ticks_since_boot - the_period->time_at_period; + + status->ticks_executed_since_last_period = + the_period->owner->ticks_executed - + the_period->owner_ticks_executed_at_period; + } + + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/cpukit/rtems/src/ratemonident.c b/cpukit/rtems/src/ratemonident.c new file mode 100644 index 0000000000..0dba33504a --- /dev/null +++ b/cpukit/rtems/src/ratemonident.c @@ -0,0 +1,56 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_ident + * + * This directive returns the system ID associated with + * the rate monotonic period name. + * + * Input parameters: + * name - user defined period name + * id - pointer to period id + * + * Output parameters: + * *id - region id + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_ident( + rtems_name name, + Objects_Id *id +) +{ + Objects_Name_to_id_errors status; + + status = _Objects_Name_to_id( + &_Rate_monotonic_Information, + &name, + OBJECTS_SEARCH_LOCAL_NODE, + id + ); + + return _Status_Object_name_errors_to_status[ status ]; +} diff --git a/cpukit/rtems/src/ratemonperiod.c b/cpukit/rtems/src/ratemonperiod.c new file mode 100644 index 0000000000..95a09c453e --- /dev/null +++ b/cpukit/rtems/src/ratemonperiod.c @@ -0,0 +1,159 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * rtems_rate_monotonic_period + * + * This directive allows a thread to manipulate a rate monotonic timer. + * + * Input parameters: + * id - rate monotonic id + * length - length of period (in ticks) + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_rate_monotonic_period( + Objects_Id id, + rtems_interval length +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + rtems_status_code return_value; + rtems_rate_monotonic_period_states local_state; + ISR_Level level; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* should never return this */ + return RTEMS_INTERNAL_ERROR; + + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + if ( !_Thread_Is_executing( the_period->owner ) ) { + _Thread_Enable_dispatch(); + return RTEMS_NOT_OWNER_OF_RESOURCE; + } + + if ( length == RTEMS_PERIOD_STATUS ) { + switch ( the_period->state ) { + case RATE_MONOTONIC_INACTIVE: + return_value = RTEMS_NOT_DEFINED; + break; + case RATE_MONOTONIC_ACTIVE: + return_value = RTEMS_SUCCESSFUL; + break; + case RATE_MONOTONIC_EXPIRED: + return_value = RTEMS_TIMEOUT; + break; + default: /* unreached -- only to remove warnings */ + return_value = RTEMS_INTERNAL_ERROR; + break; + } + _Thread_Enable_dispatch(); + return( return_value ); + } + + _ISR_Disable( level ); + switch ( the_period->state ) { + case RATE_MONOTONIC_INACTIVE: + _ISR_Enable( level ); + the_period->state = RATE_MONOTONIC_ACTIVE; + _Watchdog_Initialize( + &the_period->Timer, + _Rate_monotonic_Timeout, + id, + NULL + ); + + the_period->owner_ticks_executed_at_period = + _Thread_Executing->ticks_executed; + + the_period->time_at_period = _Watchdog_Ticks_since_boot; + + _Watchdog_Insert_ticks( &the_period->Timer, length ); + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + + case RATE_MONOTONIC_ACTIVE: + /* + * This tells the _Rate_monotonic_Timeout that this task is + * in the process of blocking on the period. + */ + + the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; + _ISR_Enable( level ); + + _Thread_Executing->Wait.id = the_period->Object.id; + _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); + + /* + * Did the watchdog timer expire while we were actually blocking + * on it? + */ + + _ISR_Disable( level ); + local_state = the_period->state; + the_period->state = RATE_MONOTONIC_ACTIVE; + _ISR_Enable( level ); + + /* + * If it did, then we want to unblock ourself and continue as + * if nothing happen. The period was reset in the timeout routine. + */ + + if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING ) + _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); + + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + break; + + case RATE_MONOTONIC_EXPIRED: + _ISR_Enable( level ); + the_period->state = RATE_MONOTONIC_ACTIVE; + the_period->owner_ticks_executed_at_period = + _Thread_Executing->ticks_executed; + the_period->time_at_period = _Watchdog_Ticks_since_boot; + + _Watchdog_Insert_ticks( &the_period->Timer, length ); + _Thread_Enable_dispatch(); + return RTEMS_TIMEOUT; + + case RATE_MONOTONIC_OWNER_IS_BLOCKING: + case RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING: + /* + * These should never happen. + */ + break; + } + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/cpukit/rtems/src/ratemontimeout.c b/cpukit/rtems/src/ratemontimeout.c new file mode 100644 index 0000000000..6c8a1976f4 --- /dev/null +++ b/cpukit/rtems/src/ratemontimeout.c @@ -0,0 +1,77 @@ +/* + * Rate Monotonic Manager + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * _Rate_monotonic_Timeout + * + * This routine processes a period ending. If the owning thread + * is waiting for the period, that thread is unblocked and the + * period reinitiated. Otherwise, the period is expired. + * This routine is called by the watchdog handler. + * + * Input parameters: + * id - period id + * + * Output parameters: NONE + */ + +void _Rate_monotonic_Timeout( + Objects_Id id, + void *ignored +) +{ + Rate_monotonic_Control *the_period; + Objects_Locations location; + Thread_Control *the_thread; + + the_period = _Rate_monotonic_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: /* impossible */ + case OBJECTS_ERROR: + break; + + case OBJECTS_LOCAL: + the_thread = the_period->owner; + if ( _States_Is_waiting_for_period( the_thread->current_state ) && + the_thread->Wait.id == the_period->Object.id ) { + _Thread_Unblock( the_thread ); + the_period->owner_ticks_executed_at_period = + the_thread->ticks_executed; + + the_period->time_at_period = _Watchdog_Ticks_since_boot; + + _Watchdog_Reset( &the_period->Timer ); + } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { + the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; + the_period->owner_ticks_executed_at_period = + the_thread->ticks_executed; + + the_period->time_at_period = _Watchdog_Ticks_since_boot; + _Watchdog_Reset( &the_period->Timer ); + } else + the_period->state = RATE_MONOTONIC_EXPIRED; + _Thread_Unnest_dispatch(); + break; + } +} -- cgit v1.2.3