On Mon, Nov 15, 2021 at 10:13 AM Sebastian Huber <sebastian.hu...@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@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel