summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-12 11:16:45 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-12 11:16:45 +0200
commit55faa447686f632bf1b98827cdec37a44bd69da2 (patch)
treebdb60a635a651e1a3f61d7e35dc7e654c679cfa0
parentscore: Introduce thread queue surrender operation (diff)
downloadrtems-55faa447686f632bf1b98827cdec37a44bd69da2.tar.bz2
score: Improve _RBTree_Insert_inline()
Return if the inserted node is the new minimum node or not.
-rw-r--r--cpukit/score/include/rtems/score/rbtree.h10
-rw-r--r--testsuites/sptests/sprbtree01/init.c63
-rw-r--r--testsuites/sptests/sprbtree01/sprbtree01.doc1
-rw-r--r--testsuites/sptests/sprbtree01/sprbtree01.scn2
4 files changed, 74 insertions, 2 deletions
diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h
index e94560ea88..a5a6cf367b 100644
--- a/cpukit/score/include/rtems/score/rbtree.h
+++ b/cpukit/score/include/rtems/score/rbtree.h
@@ -451,8 +451,12 @@ void _RBTree_Replace_node(
* the key is stored in a local variable.
* @param less Must return true if the specified key is less than the key of
* the node, otherwise false.
+ *
+ * @retval true The inserted node is the new minimum node according to the
+ * specified less order function.
+ * @retval false Otherwise.
*/
-RTEMS_INLINE_ROUTINE void _RBTree_Insert_inline(
+RTEMS_INLINE_ROUTINE bool _RBTree_Insert_inline(
RBTree_Control *the_rbtree,
RBTree_Node *the_node,
const void *key,
@@ -461,9 +465,11 @@ RTEMS_INLINE_ROUTINE void _RBTree_Insert_inline(
{
RBTree_Node **link;
RBTree_Node *parent;
+ bool is_new_minimum;
link = _RBTree_Root_reference( the_rbtree );
parent = NULL;
+ is_new_minimum = true;
while ( *link != NULL ) {
parent = *link;
@@ -472,11 +478,13 @@ RTEMS_INLINE_ROUTINE void _RBTree_Insert_inline(
link = _RBTree_Left_reference( parent );
} else {
link = _RBTree_Right_reference( parent );
+ is_new_minimum = false;
}
}
_RBTree_Add_child( the_node, parent, link );
_RBTree_Insert_color( the_rbtree, the_node );
+ return is_new_minimum;
}
/**
diff --git a/testsuites/sptests/sprbtree01/init.c b/testsuites/sptests/sprbtree01/init.c
index fd3737ced5..054350815c 100644
--- a/testsuites/sptests/sprbtree01/init.c
+++ b/testsuites/sptests/sprbtree01/init.c
@@ -234,6 +234,68 @@ static void test_rbtree_min_max(void)
rtems_test_assert( rtems_rbtree_is_empty( &tree ) );
}
+static bool test_less(
+ const void *left,
+ const RBTree_Node *right
+)
+{
+ const int *the_left;
+ const test_node *the_right;
+
+ the_left = left;
+ the_right = RTEMS_CONTAINER_OF( right, test_node, Node );
+
+ return *the_left < the_right->key;
+}
+
+static void test_rbtree_insert_inline( void )
+{
+ RBTree_Control tree;
+ test_node a;
+ test_node b;
+ test_node c;
+ int key;
+ bool is_new_minimum;
+
+ puts( "INIT - Verify _RBTree_Insert_inline" );
+
+ a.key = 1;
+ b.key = 2;
+ c.key = 3;
+
+ _RBTree_Initialize_empty( &tree );
+ _RBTree_Initialize_node( &a.Node );
+ _RBTree_Initialize_node( &b.Node );
+ _RBTree_Initialize_node( &c.Node );
+
+ key = b.key;
+ is_new_minimum = _RBTree_Insert_inline(
+ &tree,
+ &b.Node,
+ &key,
+ test_less
+ );
+ rtems_test_assert( is_new_minimum );
+
+ key = c.key;
+ is_new_minimum = _RBTree_Insert_inline(
+ &tree,
+ &c.Node,
+ &key,
+ test_less
+ );
+ rtems_test_assert( !is_new_minimum );
+
+ key = a.key;
+ is_new_minimum = _RBTree_Insert_inline(
+ &tree,
+ &a.Node,
+ &key,
+ test_less
+ );
+ rtems_test_assert( is_new_minimum );
+}
+
#define TN( i ) &node_array[ i ].Node
typedef struct {
@@ -2210,6 +2272,7 @@ rtems_task Init( rtems_task_argument ignored )
}
test_rbtree_min_max();
+ test_rbtree_insert_inline();
test_rbtree_random_ops();
TEST_END();
diff --git a/testsuites/sptests/sprbtree01/sprbtree01.doc b/testsuites/sptests/sprbtree01/sprbtree01.doc
index 0fb3b3ac97..bffb5625b2 100644
--- a/testsuites/sptests/sprbtree01/sprbtree01.doc
+++ b/testsuites/sptests/sprbtree01/sprbtree01.doc
@@ -16,6 +16,7 @@ directives:
rtems_rbtree_insert
rtems_rbtree_get
rtems_rbtree_peek
+ _RBTree_Insert_inline
concepts:
diff --git a/testsuites/sptests/sprbtree01/sprbtree01.scn b/testsuites/sptests/sprbtree01/sprbtree01.scn
index a18a17fbdb..9cf21f3627 100644
--- a/testsuites/sptests/sprbtree01/sprbtree01.scn
+++ b/testsuites/sptests/sprbtree01/sprbtree01.scn
@@ -18,7 +18,6 @@ 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_control
INIT - Removing 100 nodes
INIT - Insert 20 random numbers
INIT - Removing 20 nodes
@@ -32,5 +31,6 @@ INIT - Verify rtems_rbtree_insert with 100 nodes value [99,0]
INIT - Verify rtems_rbtree_find in a duplicate tree
INIT - Removing 100 nodes
INIT - Verify min/max node updates
+INIT - Verify _RBTree_Insert_inline
INIT - Random operations
*** END OF TEST SPRBTREE 1 ***