[PATCH] score: Simplify _Watchdog_Next_first()
Gedare Bloom
gedare at rtems.org
Mon Oct 11 16:38:01 UTC 2021
ok
On Mon, Oct 11, 2021 at 5:24 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> ---
> cpukit/include/rtems/score/watchdogimpl.h | 55 +++++++++++++++--------
> 1 file changed, 36 insertions(+), 19 deletions(-)
>
> diff --git a/cpukit/include/rtems/score/watchdogimpl.h b/cpukit/include/rtems/score/watchdogimpl.h
> index 7b364b8828..ba1a884a3d 100644
> --- a/cpukit/include/rtems/score/watchdogimpl.h
> +++ b/cpukit/include/rtems/score/watchdogimpl.h
> @@ -351,33 +351,50 @@ RTEMS_INLINE_ROUTINE bool _Watchdog_Is_scheduled(
> }
>
> /**
> - * @brief Sets the first node of the header.
> + * @brief Sets the first watchdog of the watchdog collection to the next
> + * watchdog of the current first watchdog.
> *
> - * Sets the first node of the header to either the leftmost child node of the
> - * watchdog control node, or if not present sets it to the right child node of
> - * the watchdog control node. if both are not present, the new first node is
> - * the parent node of the current first node.
> + * This function may be used during watchdog removals, see _Watchdog_Remove()
> + * and _Watchdog_Tickle().
> *
> - * @param[in, out] header The watchdog header.
> - * @param the_watchdog The watchdog control node for the operation.
> + * @param[in, out] header is the watchdog collection header.
> + *
> + * @param first is the current first watchdog which should be removed
> + * afterwards.
> */
> RTEMS_INLINE_ROUTINE void _Watchdog_Next_first(
> - Watchdog_Header *header,
> - Watchdog_Control *the_watchdog
> + Watchdog_Header *header,
> + const Watchdog_Control *first
> )
> {
> - RBTree_Node *node = _RBTree_Right( &the_watchdog->Node.RBTree );
> -
> - if ( node != NULL ) {
> - RBTree_Node *left;
> -
> - while ( ( left = _RBTree_Left( node ) ) != NULL ) {
> - node = left;
> - }
> + RBTree_Node *right;
>
> - header->first = node;
> + /*
> + * This function uses the following properties of red-black trees:
> + *
> + * 1. Every leaf (NULL) is black.
> + *
> + * 2. If a node is red, then both its children are black.
> + *
> + * 3. Every simple path from a node to a descendant leaf contains the same
> + * number of black nodes.
> + *
> + * The first node has no left child. So every path from the first node has
> + * exactly one black node (including leafs). The first node cannot have a
> + * non-leaf black right child. It may have a red right child. In this case
> + * both children must be leafs.
> + */
> + _Assert( header->first == &first->Node.RBTree );
> + _Assert( _RBTree_Left( &first->Node.RBTree ) == NULL );
> + right = _RBTree_Right( &first->Node.RBTree );
> +
> + if ( right != NULL ) {
> + _Assert( RB_COLOR( right, Node ) == RB_RED );
> + _Assert( _RBTree_Left( right ) == NULL );
> + _Assert( _RBTree_Right( right ) == NULL );
> + header->first = right;
> } else {
> - header->first = _RBTree_Parent( &the_watchdog->Node.RBTree );
> + header->first = _RBTree_Parent( &first->Node.RBTree );
> }
> }
>
> --
> 2.31.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list