[PATCH 02/27] score: Add red-black tree append/prepend

Gedare Bloom gedare at rtems.org
Sat Nov 20 18:36:23 UTC 2021


On Mon, Nov 15, 2021 at 10:13 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> These functions are a faster alternative to _RBTree_Insert_inline() if
> it is known that the new node is the maximum/minimum node.
>
> Update #4531.
> ---
>  cpukit/include/rtems/score/rbtreeimpl.h | 26 +++++++++++
>  cpukit/score/src/rbtreeappend.c         | 58 +++++++++++++++++++++++++
>  cpukit/score/src/rbtreeprepend.c        | 58 +++++++++++++++++++++++++
>  spec/build/cpukit/librtemscpu.yml       |  2 +
>  4 files changed, 144 insertions(+)
>  create mode 100644 cpukit/score/src/rbtreeappend.c
>  create mode 100644 cpukit/score/src/rbtreeprepend.c
>
> diff --git a/cpukit/include/rtems/score/rbtreeimpl.h b/cpukit/include/rtems/score/rbtreeimpl.h
> index 597c24d771..0867240d59 100644
> --- a/cpukit/include/rtems/score/rbtreeimpl.h
> +++ b/cpukit/include/rtems/score/rbtreeimpl.h
> @@ -30,6 +30,32 @@ extern "C" {
>   * @{
>   */
>
> +/**
> + * @brief Appends the node to the red-black tree.
> + *
> + * The appended node is the new maximum node of the tree.  The caller shall
> + * ensure that the appended node is indeed the maximum node with respect to the
> + * tree order.
> + *
> + * @param[in, out] the_rbtree is the red-black tree control.
> + *
> + * @param the_node[out] is the node to append.
> + */
> +void _RBTree_Append( RBTree_Control *the_rbtree, RBTree_Node *the_node );
> +
> +/**
> + * @brief Prepends the node to the red-black tree.
> + *
> + * The prepended node is the new minimum node of the tree.  The caller shall
> + * ensure that the prepended node is indeed the minimum node with respect to the
> + * tree order.
> + *
> + * @param[in, out] the_rbtree is the red-black tree control.
> + *
> + * @param the_node[out] is the node to prepend.
> + */
> +void _RBTree_Prepend( RBTree_Control *the_rbtree, RBTree_Node *the_node );
> +
>  /**
>   * @brief Red-black tree visitor.
>   *
> diff --git a/cpukit/score/src/rbtreeappend.c b/cpukit/score/src/rbtreeappend.c
> new file mode 100644
> index 0000000000..e36f6bc805
> --- /dev/null
> +++ b/cpukit/score/src/rbtreeappend.c
> @@ -0,0 +1,58 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/**
> + * @file
> + *
> + * @ingroup RTEMSScoreRBTree
> + *
> + * @brief This source file contains the implementation of
> + *   _RBTree_Append().
> + */
> +
> +/*
> + * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <rtems/score/rbtreeimpl.h>
> +
> +void _RBTree_Append( RBTree_Control *the_rbtree, RBTree_Node *the_node )
> +{
> +  RBTree_Node **link;
> +  RBTree_Node  *parent;
> +
> +  link = _RBTree_Root_reference( the_rbtree );
> +  parent = NULL;
> +
> +  while ( *link != NULL ) {
> +    parent = *link;
> +    link = _RBTree_Right_reference( parent );
> +  }
> +
> +  _RBTree_Add_child( the_node, parent, link );
> +  _RBTree_Insert_color( the_rbtree, the_node );
> +}

Can this be simplified?
RBTree_Node *p = _RBTree_Maximum( the_rbtree );
RBTree_Insert_with_parent( the_rbtree, the_node, p,
_RBTree_Right_reference( p ) );

Similar below.

> diff --git a/cpukit/score/src/rbtreeprepend.c b/cpukit/score/src/rbtreeprepend.c
> new file mode 100644
> index 0000000000..f154f51d36
> --- /dev/null
> +++ b/cpukit/score/src/rbtreeprepend.c
> @@ -0,0 +1,58 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/**
> + * @file
> + *
> + * @ingroup RTEMSScoreRBTree
> + *
> + * @brief This source file contains the implementation of
> + *   _RBTree_Prepend().
> + */
> +
> +/*
> + * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <rtems/score/rbtreeimpl.h>
> +
> +void _RBTree_Prepend( RBTree_Control *the_rbtree, RBTree_Node *the_node )
> +{
> +  RBTree_Node **link;
> +  RBTree_Node  *parent;
> +
> +  link = _RBTree_Root_reference( the_rbtree );
> +  parent = NULL;
> +
> +  while ( *link != NULL ) {
> +    parent = *link;
> +    link = _RBTree_Left_reference( parent );
> +  }
> +
> +  _RBTree_Add_child( the_node, parent, link );
> +  _RBTree_Insert_color( the_rbtree, the_node );
> +}
> diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
> index 063917b410..819c479191 100644
> --- a/spec/build/cpukit/librtemscpu.yml
> +++ b/spec/build/cpukit/librtemscpu.yml
> @@ -1475,6 +1475,7 @@ source:
>  - cpukit/score/src/pheapwalk.c
>  - cpukit/score/src/processormaskcopy.c
>  - cpukit/score/src/profilingisrentryexit.c
> +- cpukit/score/src/rbtreeappend.c
>  - cpukit/score/src/rbtreeextract.c
>  - cpukit/score/src/rbtreeinsert.c
>  - cpukit/score/src/rbtreeiterate.c
> @@ -1482,6 +1483,7 @@ source:
>  - cpukit/score/src/rbtreemin.c
>  - cpukit/score/src/rbtreenext.c
>  - cpukit/score/src/rbtreepostorder.c
> +- cpukit/score/src/rbtreeprepend.c
>  - cpukit/score/src/rbtreeprev.c
>  - cpukit/score/src/rbtreereplace.c
>  - cpukit/score/src/sched.c
> --
> 2.26.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list