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
|
## WATCHDOG_C_FILES
|
||||||
libscore_a_SOURCES += src/watchdog.c src/watchdogadjust.c \
|
libscore_a_SOURCES += src/watchdog.c src/watchdogadjust.c \
|
||||||
src/watchdogadjusttochain.c src/watchdoginsert.c src/watchdogremove.c \
|
src/watchdogadjusttochain.c src/watchdoginsert.c src/watchdogremove.c
|
||||||
src/watchdogtickle.c
|
|
||||||
libscore_a_SOURCES += src/watchdogtickssinceboot.c
|
libscore_a_SOURCES += src/watchdogtickssinceboot.c
|
||||||
|
|
||||||
## USEREXT_C_FILES
|
## USEREXT_C_FILES
|
||||||
|
|||||||
@@ -152,16 +152,6 @@ Watchdog_States _Watchdog_Remove (
|
|||||||
Watchdog_Control *the_watchdog
|
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
|
* @brief Adjusts the header watchdog chain in the backward direction for
|
||||||
* units ticks.
|
* units ticks.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
#include <rtems/score/watchdogimpl.h>
|
#include <rtems/score/watchdogimpl.h>
|
||||||
#include <rtems/score/assert.h>
|
#include <rtems/score/assert.h>
|
||||||
|
|
||||||
void _Watchdog_Remove_it(
|
static void _Watchdog_Remove_it(
|
||||||
Watchdog_Header *header,
|
Watchdog_Header *header,
|
||||||
Watchdog_Control *the_watchdog
|
Watchdog_Control *the_watchdog
|
||||||
)
|
)
|
||||||
@@ -107,3 +107,68 @@ Watchdog_States _Watchdog_Remove(
|
|||||||
_Watchdog_Release( header, &lock_context );
|
_Watchdog_Release( header, &lock_context );
|
||||||
return( previous_state );
|
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