summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/watchdogimpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/include/rtems/score/watchdogimpl.h')
-rw-r--r--cpukit/score/include/rtems/score/watchdogimpl.h574
1 files changed, 0 insertions, 574 deletions
diff --git a/cpukit/score/include/rtems/score/watchdogimpl.h b/cpukit/score/include/rtems/score/watchdogimpl.h
deleted file mode 100644
index f219a70768..0000000000
--- a/cpukit/score/include/rtems/score/watchdogimpl.h
+++ /dev/null
@@ -1,574 +0,0 @@
-/**
- * @file
- *
- * @brief Inlined Routines in the Watchdog Handler
- *
- * This file contains the static inline implementation of all inlined
- * routines in the Watchdog Handler.
- */
-
-/*
- * COPYRIGHT (c) 1989-2004.
- * 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.
- */
-
-#ifndef _RTEMS_SCORE_WATCHDOGIMPL_H
-#define _RTEMS_SCORE_WATCHDOGIMPL_H
-
-#include <rtems/score/watchdog.h>
-#include <rtems/score/assert.h>
-#include <rtems/score/isrlock.h>
-#include <rtems/score/percpu.h>
-#include <rtems/score/rbtreeimpl.h>
-
-#include <sys/types.h>
-#include <sys/timespec.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @addtogroup ScoreWatchdog
- * @{
- */
-
-/**
- * @brief Watchdog states.
- */
-typedef enum {
- /**
- * @brief The watchdog is scheduled and a black node in the red-black tree.
- */
- WATCHDOG_SCHEDULED_BLACK,
-
- /**
- * @brief The watchdog is scheduled and a red node in the red-black tree.
- */
- WATCHDOG_SCHEDULED_RED,
-
- /**
- * @brief The watchdog is inactive.
- */
- WATCHDOG_INACTIVE,
-
- /**
- * @brief The watchdog is on a chain of pending watchdogs.
- *
- * This state is used by the timer server for example.
- */
- WATCHDOG_PENDING
-} Watchdog_State;
-
-/**
- * @brief Watchdog initializer for static initialization.
- *
- * The processor of this watchdog is set to processor with index zero.
- *
- * @see _Watchdog_Preinitialize().
- */
-#if defined(RTEMS_SMP)
- #define WATCHDOG_INITIALIZER( routine ) \
- { \
- { { { NULL, NULL, NULL, WATCHDOG_INACTIVE } } }, \
- &_Per_CPU_Information[ 0 ].per_cpu, \
- ( routine ), \
- 0 \
- }
-#else
- #define WATCHDOG_INITIALIZER( routine ) \
- { \
- { { { NULL, NULL, NULL, WATCHDOG_INACTIVE } } }, \
- ( routine ), \
- 0 \
- }
-#endif
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Header_initialize(
- Watchdog_Header *header
-)
-{
- _RBTree_Initialize_empty( &header->Watchdogs );
- header->first = NULL;
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Header_destroy(
- Watchdog_Header *header
-)
-{
- /* Do nothing */
- (void) header;
-}
-
-/**
- * @brief Performs a watchdog tick.
- *
- * @param cpu The processor for this watchdog tick.
- */
-void _Watchdog_Tick( struct Per_CPU_Control *cpu );
-
-RTEMS_INLINE_ROUTINE Watchdog_State _Watchdog_Get_state(
- const Watchdog_Control *the_watchdog
-)
-{
- return RB_COLOR( &the_watchdog->Node.RBTree, Node );
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Set_state(
- Watchdog_Control *the_watchdog,
- Watchdog_State state
-)
-{
- RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state;
-}
-
-RTEMS_INLINE_ROUTINE Per_CPU_Control *_Watchdog_Get_CPU(
- const Watchdog_Control *the_watchdog
-)
-{
-#if defined(RTEMS_SMP)
- return the_watchdog->cpu;
-#else
- return _Per_CPU_Get_by_index( 0 );
-#endif
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Set_CPU(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu
-)
-{
-#if defined(RTEMS_SMP)
- the_watchdog->cpu = cpu;
-#else
- (void) cpu;
-#endif
-}
-
-/**
- * @brief Pre-initializes a watchdog.
- *
- * This routine must be called before a watchdog is used in any way. The
- * exception are statically initialized watchdogs via WATCHDOG_INITIALIZER().
- *
- * @param[in] the_watchdog The uninitialized watchdog.
- */
-RTEMS_INLINE_ROUTINE void _Watchdog_Preinitialize(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu
-)
-{
- _Watchdog_Set_CPU( the_watchdog, cpu );
- _Watchdog_Set_state( the_watchdog, WATCHDOG_INACTIVE );
-
-#if defined(RTEMS_DEBUG)
- the_watchdog->routine = NULL;
- the_watchdog->expire = 0;
-#endif
-}
-
-/**
- * @brief Initializes a watchdog with a new service routine.
- *
- * The watchdog must be inactive.
- */
-RTEMS_INLINE_ROUTINE void _Watchdog_Initialize(
- Watchdog_Control *the_watchdog,
- Watchdog_Service_routine_entry routine
-)
-{
- _Assert( _Watchdog_Get_state( the_watchdog ) == WATCHDOG_INACTIVE );
- the_watchdog->routine = routine;
-}
-
-void _Watchdog_Do_tickle(
- Watchdog_Header *header,
- uint64_t now,
-#if defined(RTEMS_SMP)
- ISR_lock_Control *lock,
-#endif
- ISR_lock_Context *lock_context
-);
-
-#if defined(RTEMS_SMP)
- #define _Watchdog_Tickle( header, now, lock, lock_context ) \
- _Watchdog_Do_tickle( header, now, lock, lock_context )
-#else
- #define _Watchdog_Tickle( header, now, lock, lock_context ) \
- _Watchdog_Do_tickle( header, now, lock_context )
-#endif
-
-/**
- * @brief Inserts a watchdog into the set of scheduled watchdogs according to
- * the specified expiration time.
- *
- * The watchdog must be inactive.
- */
-void _Watchdog_Insert(
- Watchdog_Header *header,
- Watchdog_Control *the_watchdog,
- uint64_t expire
-);
-
-/**
- * @brief In case the watchdog is scheduled, then it is removed from the set of
- * scheduled watchdogs.
- *
- * The watchdog must be initialized before this call.
- */
-void _Watchdog_Remove(
- Watchdog_Header *header,
- Watchdog_Control *the_watchdog
-);
-
-/**
- * @brief In case the watchdog is scheduled, then it is removed from the set of
- * scheduled watchdogs.
- *
- * The watchdog must be initialized before this call.
- *
- * @retval 0 The now time is greater than or equal to the expiration time of
- * the watchdog.
- * @retval other The difference of the now and expiration time.
- */
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Cancel(
- Watchdog_Header *header,
- Watchdog_Control *the_watchdog,
- uint64_t now
-)
-{
- uint64_t expire;
- uint64_t remaining;
-
- expire = the_watchdog->expire;
-
- if ( now < expire ) {
- remaining = expire - now;
- } else {
- remaining = 0;
- }
-
- _Watchdog_Remove( header, the_watchdog );
-
- return remaining;
-}
-
-RTEMS_INLINE_ROUTINE bool _Watchdog_Is_scheduled(
- const Watchdog_Control *the_watchdog
-)
-{
- return _Watchdog_Get_state( the_watchdog ) < WATCHDOG_INACTIVE;
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Next_first(
- Watchdog_Header *header,
- Watchdog_Control *the_watchdog
-)
-{
- RBTree_Node *node = _RBTree_Right( &the_watchdog->Node.RBTree );
-
- if ( node != NULL ) {
- RBTree_Node *left;
-
- while ( ( left = _RBTree_Left( node ) ) != NULL ) {
- node = left;
- }
-
- header->first = node;
- } else {
- header->first = _RBTree_Parent( &the_watchdog->Node.RBTree );
- }
-}
-
-/**
- * @brief The maximum watchdog ticks value for the far future.
- */
-#define WATCHDOG_MAXIMUM_TICKS UINT64_MAX
-
-#define WATCHDOG_NANOSECONDS_PER_SECOND 1000000000
-
-/**
- * @brief The bits necessary to store 1000000000
- * (= WATCHDOG_NANOSECONDS_PER_SECOND) nanoseconds.
- *
- * The expiration time is an unsigned 64-bit integer. To store absolute
- * timeouts we use 30 bits (2**30 == 1073741824) for the nanoseconds and 34
- * bits for the seconds since UNIX Epoch. This leads to a year 2514 problem.
- */
-#define WATCHDOG_BITS_FOR_1E9_NANOSECONDS 30
-
-/**
- * @brief The maximum number of seconds representable in the realtime watchdog
- * format.
- *
- * We have 2**34 bits for the seconds part.
- */
-#define WATCHDOG_REALTIME_MAX_SECONDS 0x3ffffffff
-
-RTEMS_INLINE_ROUTINE bool _Watchdog_Is_valid_timespec(
- const struct timespec *ts
-)
-{
- return ts != NULL
- && (unsigned long) ts->tv_nsec < WATCHDOG_NANOSECONDS_PER_SECOND;
-}
-
-RTEMS_INLINE_ROUTINE bool _Watchdog_Is_valid_interval_timespec(
- const struct timespec *ts
-)
-{
- return _Watchdog_Is_valid_timespec( ts ) && ts->tv_sec >= 0;
-}
-
-RTEMS_INLINE_ROUTINE const struct timespec * _Watchdog_Future_timespec(
- struct timespec *now,
- const struct timespec *delta
-)
-{
- uint64_t sec;
-
- if ( !_Watchdog_Is_valid_interval_timespec( delta ) ) {
- return NULL;
- }
-
- sec = (uint64_t) now->tv_sec;
- sec += (uint64_t) delta->tv_sec;
- now->tv_nsec += delta->tv_nsec;
-
- /* We have 2 * (2**63 - 1) + 1 == UINT64_MAX */
- if ( now->tv_nsec >= WATCHDOG_NANOSECONDS_PER_SECOND ) {
- now->tv_nsec -= WATCHDOG_NANOSECONDS_PER_SECOND;
- ++sec;
- }
-
- if ( sec <= INT64_MAX ) {
- now->tv_sec = sec;
- } else {
- now->tv_sec = INT64_MAX;
- }
-
- return now;
-}
-
-RTEMS_INLINE_ROUTINE bool _Watchdog_Is_far_future_monotonic_timespec(
- const struct timespec *ts
-)
-{
- return ts->tv_sec >= _Watchdog_Monotonic_max_seconds;
-}
-
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Monotonic_from_timespec(
- const struct timespec *ts
-)
-{
- uint64_t ticks;
-
- _Assert( _Watchdog_Is_valid_timespec( ts ) );
- _Assert( ts->tv_sec >= 0 );
- _Assert( !_Watchdog_Is_far_future_monotonic_timespec( ts ) );
-
- ticks = (uint64_t) ts->tv_sec * _Watchdog_Ticks_per_second;
- ticks += (unsigned long) ts->tv_nsec / _Watchdog_Nanoseconds_per_tick;
-
- return ticks;
-}
-
-RTEMS_INLINE_ROUTINE bool _Watchdog_Is_far_future_realtime_timespec(
- const struct timespec *ts
-)
-{
- return ts->tv_sec > WATCHDOG_REALTIME_MAX_SECONDS;
-}
-
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Realtime_from_seconds(
- uint32_t seconds
-)
-{
- uint64_t ticks = seconds;
-
- ticks <<= WATCHDOG_BITS_FOR_1E9_NANOSECONDS;
-
- return ticks;
-}
-
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Realtime_from_timespec(
- const struct timespec *ts
-)
-{
- uint64_t ticks;
-
- _Assert( _Watchdog_Is_valid_timespec( ts ) );
- _Assert( ts->tv_sec >= 0 );
- _Assert( !_Watchdog_Is_far_future_realtime_timespec( ts ) );
-
- ticks = (uint64_t) ts->tv_sec;
- ticks <<= WATCHDOG_BITS_FOR_1E9_NANOSECONDS;
- ticks |= (uint32_t) ts->tv_nsec;
-
- return ticks;
-}
-
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Realtime_from_sbintime(
- sbintime_t sbt
-)
-{
- uint64_t ticks = ( sbt >> 32 ) << WATCHDOG_BITS_FOR_1E9_NANOSECONDS;
-
- ticks |= ( (uint64_t) 1000000000 * (uint32_t) sbt ) >> 32;
-
- return ticks;
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_acquire_critical(
- Per_CPU_Control *cpu,
- ISR_lock_Context *lock_context
-)
-{
- _ISR_lock_Acquire( &cpu->Watchdog.Lock, lock_context );
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_release_critical(
- Per_CPU_Control *cpu,
- ISR_lock_Context *lock_context
-)
-{
- _ISR_lock_Release( &cpu->Watchdog.Lock, lock_context );
-}
-
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert_ticks(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu,
- Watchdog_Interval ticks
-)
-{
- ISR_lock_Context lock_context;
- Watchdog_Header *header;
- uint64_t expire;
-
- header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_MONOTONIC ];
-
- _Watchdog_Set_CPU( the_watchdog, cpu );
-
- _Watchdog_Per_CPU_acquire_critical( cpu, &lock_context );
- expire = ticks + cpu->Watchdog.ticks;
- _Watchdog_Insert(header, the_watchdog, expire);
- _Watchdog_Per_CPU_release_critical( cpu, &lock_context );
- return expire;
-}
-
-RTEMS_INLINE_ROUTINE bool _Watchdog_Per_CPU_lazy_insert_monotonic(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu,
- uint64_t expire
-)
-{
- ISR_lock_Context lock_context;
- Watchdog_Header *header;
- bool insert;
-
- header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_MONOTONIC ];
-
- _Watchdog_Set_CPU( the_watchdog, cpu );
-
- _Watchdog_Per_CPU_acquire_critical( cpu, &lock_context );
- insert = ( expire > cpu->Watchdog.ticks );
-
- if ( insert ) {
- _Watchdog_Insert(header, the_watchdog, expire);
- }
-
- _Watchdog_Per_CPU_release_critical( cpu, &lock_context );
- return insert;
-}
-
-RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert_realtime(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu,
- uint64_t expire
-)
-{
- ISR_lock_Context lock_context;
- Watchdog_Header *header;
-
- header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_REALTIME ];
-
- _Watchdog_Set_CPU( the_watchdog, cpu );
-
- _Watchdog_Per_CPU_acquire_critical( cpu, &lock_context );
- _Watchdog_Insert(header, the_watchdog, expire);
- _Watchdog_Per_CPU_release_critical( cpu, &lock_context );
- return expire;
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_remove(
- Watchdog_Control *the_watchdog,
- Per_CPU_Control *cpu,
- Watchdog_Header *header
-)
-{
- ISR_lock_Context lock_context;
-
- _Watchdog_Per_CPU_acquire_critical( cpu, &lock_context );
- _Watchdog_Remove(
- header,
- the_watchdog
- );
- _Watchdog_Per_CPU_release_critical( cpu, &lock_context );
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_remove_monotonic(
- Watchdog_Control *the_watchdog
-)
-{
- Per_CPU_Control *cpu;
-
- cpu = _Watchdog_Get_CPU( the_watchdog );
- _Watchdog_Per_CPU_remove(
- the_watchdog,
- cpu,
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_MONOTONIC ]
- );
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_remove_realtime(
- Watchdog_Control *the_watchdog
-)
-{
- Per_CPU_Control *cpu;
-
- cpu = _Watchdog_Get_CPU( the_watchdog );
- _Watchdog_Per_CPU_remove(
- the_watchdog,
- cpu,
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_REALTIME ]
- );
-}
-
-RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_tickle_realtime(
- Per_CPU_Control *cpu,
- uint64_t now
-)
-{
- ISR_lock_Context lock_context;
-
- _ISR_lock_ISR_disable_and_acquire( &cpu->Watchdog.Lock, &lock_context );
- _Watchdog_Tickle(
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_REALTIME ],
- now,
- &cpu->Watchdog.Lock,
- &lock_context
- );
-}
-
-/** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-/* end of include file */