[PATCH 2/2] rbtree: Rename find header in find control
Simplify _RBTree_Find_control(). Avoid superfluous NULL pointer checks. --- cpukit/sapi/include/rtems/rbtree.h | 8 cpukit/score/include/rtems/score/rbtree.h| 29 ++-- testsuites/sptests/sprbtree01/init.c | 9 ++--- testsuites/sptests/sprbtree01/sprbtree01.scn | 2 +- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/cpukit/sapi/include/rtems/rbtree.h b/cpukit/sapi/include/rtems/rbtree.h index dbc6d20..4e6d852 100644 --- a/cpukit/sapi/include/rtems/rbtree.h +++ b/cpukit/sapi/include/rtems/rbtree.h @@ -369,13 +369,13 @@ RTEMS_INLINE_ROUTINE rtems_rbtree_node *rtems_rbtree_peek_max( } /** - * @copydoc _RBTree_Find_header() + * @copydoc _RBTree_Find_control() */ -RTEMS_INLINE_ROUTINE rtems_rbtree_control *rtems_rbtree_find_header( - rtems_rbtree_node *the_node +RTEMS_INLINE_ROUTINE rtems_rbtree_control *rtems_rbtree_find_control( + const rtems_rbtree_node *the_node ) { - return _RBTree_Find_header( the_node ); + return _RBTree_Find_control( the_node ); } /** diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h index 94c8ee5..c4effce 100644 --- a/cpukit/score/include/rtems/score/rbtree.h +++ b/cpukit/score/include/rtems/score/rbtree.h @@ -431,19 +431,28 @@ RTEMS_INLINE_ROUTINE bool _RBTree_Is_root( } /** - * @brief Find the RBTree_Control header given a node in the tree. + * @brief Finds the red-black tree control given a node in the tree. * - * This function returns a pointer to the header of the Red Black - * Tree containing @a the_node if it exists, and NULL if not. + * In case the node is not a node of a tree, then this function yields + * unpredictable results. + * + * @param[in] the_node The node of interest. + * + * @return The red-black tree control of the node. */ -RTEMS_INLINE_ROUTINE RBTree_Control *_RBTree_Find_header( -RBTree_Node *the_node -) +RTEMS_INLINE_ROUTINE RBTree_Control *_RBTree_Find_control( + const RBTree_Node *the_node +) { - if(!the_node) return NULL; - if(!(the_node->parent)) return NULL; - while(the_node->parent) the_node = the_node->parent; - return (RBTree_Control*)the_node; + RBTree_Node*parent = the_node->parent; + RBTree_Control *rbtree; + + do { +rbtree = (RBTree_Control *) parent; +parent = parent->parent; + } while ( parent != NULL ); + + return rbtree; } /** diff --git a/testsuites/sptests/sprbtree01/init.c b/testsuites/sptests/sprbtree01/init.c index 68b2c92..c43871a 100644 --- a/testsuites/sptests/sprbtree01/init.c +++ b/testsuites/sptests/sprbtree01/init.c @@ -580,8 +580,8 @@ rtems_task Init( rtems_task_argument ignored ) } p = rb_find_unique(&rbtree1, &search_node.Node); - puts( "INIT - Verify rtems_rbtree_find_header" ); - if (rtems_rbtree_find_header(p) != &rbtree1) { + puts( "INIT - Verify rtems_rbtree_find_control" ); + if (rtems_rbtree_find_control(p) != &rbtree1) { puts ("INIT - ERROR ON RBTREE HEADER MISMATCH"); rtems_test_exit(0); } @@ -620,11 +620,6 @@ rtems_task Init( rtems_task_argument ignored ) rtems_test_exit(0); } - if (rtems_rbtree_find_header(NULL) != NULL) { -puts ("INIT - ERROR ON RBTREE HEADER MISMATCH"); -rtems_test_exit(0); - } - puts("INIT - Insert 20 random numbers"); for (i = 0; i < 20; i++) { node_array[i].id = numbers[i]; diff --git a/testsuites/sptests/sprbtree01/sprbtree01.scn b/testsuites/sptests/sprbtree01/sprbtree01.scn index 0d37566..73491be 100644 --- a/testsuites/sptests/sprbtree01/sprbtree01.scn +++ b/testsuites/sptests/sprbtree01/sprbtree01.scn @@ -18,7 +18,7 @@ INIT - Removing 100 nodes INIT - Verify rtems_rbtree_get_max with 100 nodes value [0,99] INIT - Verify rtems_rbtree_find INIT - Verify rtems_rbtree_predecessor/successor -INIT - Verify rtems_rbtree_find_header +INIT - Verify rtems_rbtree_find_control INIT - Removing 100 nodes INIT - Insert 20 random numbers INIT - Removing 20 nodes -- 1.8.1.4 ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel
[PATCH 1/2] rbtree: Simplify off-tree handling
Only use the parent pointer, since this pointer is never NULL for nodes which are part of a tree. Rename functions from *_off_rbtree() to *_off_tree(). --- cpukit/sapi/include/rtems/rbtree.h| 8 +++ cpukit/score/include/rtems/score/rbtree.h | 37 +-- testsuites/sptests/sprbtree01/init.c | 8 +++ 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/cpukit/sapi/include/rtems/rbtree.h b/cpukit/sapi/include/rtems/rbtree.h index 2005b36..dbc6d20 100644 --- a/cpukit/sapi/include/rtems/rbtree.h +++ b/cpukit/sapi/include/rtems/rbtree.h @@ -121,11 +121,11 @@ RTEMS_INLINE_ROUTINE void rtems_rbtree_initialize_empty( * This function sets the next and previous fields of the @a node to NULL * indicating the @a node is not part of any rbtree. */ -RTEMS_INLINE_ROUTINE void rtems_rbtree_set_off_rbtree( +RTEMS_INLINE_ROUTINE void rtems_rbtree_set_off_tree( rtems_rbtree_node *node ) { - _RBTree_Set_off_rbtree( node ); + _RBTree_Set_off_tree( node ); } /** @@ -134,11 +134,11 @@ RTEMS_INLINE_ROUTINE void rtems_rbtree_set_off_rbtree( * This function returns true if the @a node is not on a rbtree. A @a node is * off rbtree if the next and previous fields are set to NULL. */ -RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_node_off_rbtree( +RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_node_off_tree( const rtems_rbtree_node *node ) { - return _RBTree_Is_node_off_rbtree( node ); + return _RBTree_Is_node_off_tree( node ); } /** diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h index 2ec77ea..94c8ee5 100644 --- a/cpukit/score/include/rtems/score/rbtree.h +++ b/cpukit/score/include/rtems/score/rbtree.h @@ -245,7 +245,7 @@ RBTree_Node *_RBTree_Insert( * @brief Extracts (removes) the node from the red-black tree. * * This function does not set the node off-tree. In case this is desired, then - * call _RBTree_Set_off_rbtree() after the extraction. + * call _RBTree_Set_off_tree() after the extraction. * * In case the node to extract is not a node of the tree, then this function * yields unpredictable results. @@ -273,32 +273,35 @@ RBTree_Node *_RBTree_Next( ); /** - * @brief Set off RBtree. + * @brief Sets a red-black tree node as off-tree. * - * This function sets the parent and child fields of the @a node to NULL - * indicating the @a node is not part of a rbtree. + * Do not use this function on nodes which are a part of a tree. * + * @param[in] the_node The node to set off-tree. + * + * @see _RBTree_Is_node_off_tree(). */ -RTEMS_INLINE_ROUTINE void _RBTree_Set_off_rbtree( -RBTree_Node *node -) +RTEMS_INLINE_ROUTINE void _RBTree_Set_off_tree( RBTree_Node *the_node ) { - node->parent = node->child[RBT_LEFT] = node->child[RBT_RIGHT] = NULL; + the_node->parent = NULL; } /** - * @brief Is the node off RBTree. + * @brief Returns true, if this red-black tree node is off-tree, and false + * otherwise. + * + * @param[in] the_node The node to test. + * + * @retval true The node is not a part of a tree (off-tree). + * @retval false Otherwise. * - * This function returns true if the @a node is not on a rbtree. A @a node is - * off rbtree if the parent and child fields are set to NULL. + * @see _RBTree_Set_off_tree(). */ -RTEMS_INLINE_ROUTINE bool _RBTree_Is_node_off_rbtree( -const RBTree_Node *node -) +RTEMS_INLINE_ROUTINE bool _RBTree_Is_node_off_tree( + const RBTree_Node *the_node +) { - return (node->parent == NULL) && - (node->child[RBT_LEFT] == NULL) && - (node->child[RBT_RIGHT] == NULL); + return the_node->parent == NULL; } /** diff --git a/testsuites/sptests/sprbtree01/init.c b/testsuites/sptests/sprbtree01/init.c index 2c62d12..68b2c92 100644 --- a/testsuites/sptests/sprbtree01/init.c +++ b/testsuites/sptests/sprbtree01/init.c @@ -235,8 +235,8 @@ rtems_task Init( rtems_task_argument ignored ) puts( "Init - Initialize rbtree empty" ); rtems_rbtree_initialize_empty( &rbtree1 ); - rtems_rbtree_set_off_rbtree( &node1.Node ); - rtems_test_assert( rtems_rbtree_is_node_off_rbtree( &node1.Node ) ); + rtems_rbtree_set_off_tree( &node1.Node ); + rtems_test_assert( rtems_rbtree_is_node_off_tree( &node1.Node ) ); /* verify that the rbtree insert work */ puts( "INIT - Verify rtems_rbtree_insert with two nodes" ); @@ -247,7 +247,7 @@ rtems_task Init( rtems_task_argument ignored ) rb_insert_unique( &rbtree1, &node1.Node ); rb_insert_unique( &rbtree1, &node2.Node ); - rtems_test_assert( !rtems_rbtree_is_node_off_rbtree( &node1.Node ) ); + rtems_test_assert( !rtems_rbtree_is_node_off_tree( &node1.Node ) ); _RBTree_Rotate(NULL, RBT_LEFT); i = (node1.Node.parent == &node2.Node); @@ -360,7 +360,7 @@ rtems_task Init( rtems_task_argument ignored ) puts( "INIT - rtems_rbtree_extract failed"); rtems_test_exit(0); } - rtems_test_assert( !rtems_rbtree_is_node_off_rbtree( p ) ); + rtems_test_assert( !r
[PATCH] RTEMS thread model configuration
The command line to build a GCC for RTEMS contained virtually always a '--enable-threads'. This patch helps to avoid this extra configuration command line parameter and makes the GCC build a bit more user friendly for RTEMS. This patch should be applied to GCC 4.9 branch and master. 2014-04-18 Sebastian Huber * config.gcc (*-*-rtems*): Default to 'rtems' thread model. Enable selection of 'posix' or no thread model. --- gcc/config.gcc | 8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index 9b6a5f3..6eefa53 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -791,7 +791,13 @@ case ${target} in ;; *-*-rtems*) case ${enable_threads} in -yes) thread_file='rtems' ;; +"" | yes | rtems) thread_file='rtems' ;; +posix) thread_file='posix' ;; +no) ;; +*) + echo 'Unknown thread configuration for RTEMS' + exit 1 + ;; esac tmake_file="${tmake_file} t-rtems" extra_options="${extra_options} rtems.opt" -- 1.8.1.4 ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel