forked from Imagelibrary/rtems
score: Move _Watchdog_Tickle()
Make internal function _Watchdog_Remove_it() static to avoid accidental usage. Update #2307.
This commit is contained in:
@@ -324,8 +324,7 @@ libscore_a_SOURCES += src/coretod.c src/coretodset.c src/coretodget.c \
|
||||
|
||||
## WATCHDOG_C_FILES
|
||||
libscore_a_SOURCES += src/watchdog.c src/watchdogadjust.c \
|
||||
src/watchdogadjusttochain.c src/watchdoginsert.c src/watchdogremove.c \
|
||||
src/watchdogtickle.c
|
||||
src/watchdogadjusttochain.c src/watchdoginsert.c src/watchdogremove.c
|
||||
libscore_a_SOURCES += src/watchdogtickssinceboot.c
|
||||
|
||||
## USEREXT_C_FILES
|
||||
|
||||
@@ -152,16 +152,6 @@ Watchdog_States _Watchdog_Remove (
|
||||
Watchdog_Control *the_watchdog
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Actually removes an WATCHDOG_ACTIVE or WATCHDOG_REMOVE_IT watchdog.
|
||||
*
|
||||
* @see _Watchdog_Remove() and _Watchdog_Tickle().
|
||||
*/
|
||||
void _Watchdog_Remove_it(
|
||||
Watchdog_Header *header,
|
||||
Watchdog_Control *the_watchdog
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adjusts the header watchdog chain in the backward direction for
|
||||
* units ticks.
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include <rtems/score/watchdogimpl.h>
|
||||
#include <rtems/score/assert.h>
|
||||
|
||||
void _Watchdog_Remove_it(
|
||||
static void _Watchdog_Remove_it(
|
||||
Watchdog_Header *header,
|
||||
Watchdog_Control *the_watchdog
|
||||
)
|
||||
@@ -107,3 +107,68 @@ Watchdog_States _Watchdog_Remove(
|
||||
_Watchdog_Release( header, &lock_context );
|
||||
return( previous_state );
|
||||
}
|
||||
|
||||
void _Watchdog_Tickle(
|
||||
Watchdog_Header *header
|
||||
)
|
||||
{
|
||||
ISR_lock_Context lock_context;
|
||||
|
||||
_Watchdog_Acquire( header, &lock_context );
|
||||
|
||||
if ( !_Watchdog_Is_empty( header ) ) {
|
||||
Watchdog_Control *first;
|
||||
Watchdog_Interval delta;
|
||||
|
||||
first = _Watchdog_First( header );
|
||||
delta = first->delta_interval;
|
||||
|
||||
/*
|
||||
* Although it is forbidden to insert watchdogs with a delta interval of
|
||||
* zero it is possible to observe watchdogs with a delta interval of zero
|
||||
* at this point. For example lets have a watchdog chain of one watchdog
|
||||
* with a delta interval of one and insert a new one with an initial value
|
||||
* of one. At the start of the insert procedure it will advance one step
|
||||
* and reduce its delta interval by one yielding zero. Now a tick happens.
|
||||
* This will remove the watchdog on the chain and update the insert
|
||||
* iterator. Now the insert operation continues and will insert the new
|
||||
* watchdog with a delta interval of zero.
|
||||
*/
|
||||
if ( delta > 0 ) {
|
||||
--delta;
|
||||
first->delta_interval = delta;
|
||||
}
|
||||
|
||||
while ( delta == 0 ) {
|
||||
bool run;
|
||||
Watchdog_Service_routine_entry routine;
|
||||
Objects_Id id;
|
||||
void *user_data;
|
||||
|
||||
run = ( first->state == WATCHDOG_ACTIVE );
|
||||
|
||||
_Watchdog_Remove_it( header, first );
|
||||
|
||||
routine = first->routine;
|
||||
id = first->id;
|
||||
user_data = first->user_data;
|
||||
|
||||
_Watchdog_Release( header, &lock_context );
|
||||
|
||||
if ( run ) {
|
||||
(*routine)( id, user_data );
|
||||
}
|
||||
|
||||
_Watchdog_Acquire( header, &lock_context );
|
||||
|
||||
if ( _Watchdog_Is_empty( header ) ) {
|
||||
break;
|
||||
}
|
||||
|
||||
first = _Watchdog_First( header );
|
||||
delta = first->delta_interval;
|
||||
}
|
||||
}
|
||||
|
||||
_Watchdog_Release( header, &lock_context );
|
||||
}
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @ingroup ScoreWatchdog
|
||||
* @brief Watchdog Tickle
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-1999.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/score/watchdogimpl.h>
|
||||
|
||||
void _Watchdog_Tickle(
|
||||
Watchdog_Header *header
|
||||
)
|
||||
{
|
||||
ISR_lock_Context lock_context;
|
||||
|
||||
_Watchdog_Acquire( header, &lock_context );
|
||||
|
||||
if ( !_Watchdog_Is_empty( header ) ) {
|
||||
Watchdog_Control *first;
|
||||
Watchdog_Interval delta;
|
||||
|
||||
first = _Watchdog_First( header );
|
||||
delta = first->delta_interval;
|
||||
|
||||
/*
|
||||
* Although it is forbidden to insert watchdogs with a delta interval of
|
||||
* zero it is possible to observe watchdogs with a delta interval of zero
|
||||
* at this point. For example lets have a watchdog chain of one watchdog
|
||||
* with a delta interval of one and insert a new one with an initial value
|
||||
* of one. At the start of the insert procedure it will advance one step
|
||||
* and reduce its delta interval by one yielding zero. Now a tick happens.
|
||||
* This will remove the watchdog on the chain and update the insert
|
||||
* iterator. Now the insert operation continues and will insert the new
|
||||
* watchdog with a delta interval of zero.
|
||||
*/
|
||||
if ( delta > 0 ) {
|
||||
--delta;
|
||||
first->delta_interval = delta;
|
||||
}
|
||||
|
||||
while ( delta == 0 ) {
|
||||
bool run;
|
||||
Watchdog_Service_routine_entry routine;
|
||||
Objects_Id id;
|
||||
void *user_data;
|
||||
|
||||
run = ( first->state == WATCHDOG_ACTIVE );
|
||||
|
||||
_Watchdog_Remove_it( header, first );
|
||||
|
||||
routine = first->routine;
|
||||
id = first->id;
|
||||
user_data = first->user_data;
|
||||
|
||||
_Watchdog_Release( header, &lock_context );
|
||||
|
||||
if ( run ) {
|
||||
(*routine)( id, user_data );
|
||||
}
|
||||
|
||||
_Watchdog_Acquire( header, &lock_context );
|
||||
|
||||
if ( _Watchdog_Is_empty( header ) ) {
|
||||
break;
|
||||
}
|
||||
|
||||
first = _Watchdog_First( header );
|
||||
delta = first->delta_interval;
|
||||
}
|
||||
}
|
||||
|
||||
_Watchdog_Release( header, &lock_context );
|
||||
}
|
||||
Reference in New Issue
Block a user