[PATCH 2/2] score: Add and use _RBTree_Insert_inline()

Sebastian Huber sebastian.huber at embedded-brains.de
Thu Mar 31 11:57:57 UTC 2016


---
 cpukit/posix/include/rtems/posix/keyimpl.h | 40 +++++++++++++-----------------
 cpukit/posix/src/keysetspecific.c          |  2 +-
 cpukit/score/include/rtems/score/rbtree.h  | 34 +++++++++++++++++++++++++
 3 files changed, 52 insertions(+), 24 deletions(-)

diff --git a/cpukit/posix/include/rtems/posix/keyimpl.h b/cpukit/posix/include/rtems/posix/keyimpl.h
index ca70e24..df9fc5e 100644
--- a/cpukit/posix/include/rtems/posix/keyimpl.h
+++ b/cpukit/posix/include/rtems/posix/keyimpl.h
@@ -152,35 +152,29 @@ RTEMS_INLINE_ROUTINE RBTree_Node *_POSIX_Keys_Key_value_find(
   );
 }
 
-RTEMS_INLINE_ROUTINE void _POSIX_Keys_Key_value_insert(
-  pthread_key_t              key,
-  POSIX_Keys_Key_value_pair *key_value_pair,
-  Thread_Control            *the_thread
+RTEMS_INLINE_ROUTINE bool _POSIX_Keys_Key_value_insert_less(
+  const RBTree_Node *left,
+  const RBTree_Node *right
 )
 {
-  RBTree_Node **link;
-  RBTree_Node  *parent;
-
-  link = _RBTree_Root_reference( &the_thread->Keys.Key_value_pairs );
-  parent = NULL;
-
-  while ( *link != NULL ) {
-    POSIX_Keys_Key_value_pair *parent_key_value_pair;
+  const POSIX_Keys_Key_value_pair *the_left;
+  const POSIX_Keys_Key_value_pair *the_right;
 
-    parent = *link;
-    parent_key_value_pair = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( parent );
+  the_left = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( left );
+  the_right = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( right );
 
-    if ( key < parent_key_value_pair->key ) {
-      link = _RBTree_Left_reference( parent );
-    } else {
-      link = _RBTree_Right_reference( parent );
-    }
-  }
+  return the_left->key < the_right->key;
+}
 
-  _RBTree_Add_child( &key_value_pair->Lookup_node, parent, link );
-  _RBTree_Insert_color(
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Key_value_insert(
+  Thread_Control            *the_thread,
+  POSIX_Keys_Key_value_pair *key_value_pair
+)
+{
+  _RBTree_Insert_inline(
     &the_thread->Keys.Key_value_pairs,
-    &key_value_pair->Lookup_node
+    &key_value_pair->Lookup_node,
+    _POSIX_Keys_Key_value_insert_less
   );
 }
 
diff --git a/cpukit/posix/src/keysetspecific.c b/cpukit/posix/src/keysetspecific.c
index 8b0f517..4aaa7d7 100644
--- a/cpukit/posix/src/keysetspecific.c
+++ b/cpukit/posix/src/keysetspecific.c
@@ -63,7 +63,7 @@ static int _POSIX_Keys_Create_value(
       );
 
       _POSIX_Keys_Key_value_acquire( executing, &lock_context );
-      _POSIX_Keys_Key_value_insert( key, key_value_pair, executing );
+      _POSIX_Keys_Key_value_insert( executing, key_value_pair );
       _POSIX_Keys_Key_value_release( executing, &lock_context );
       eno = 0;
     } else {
diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h
index 111b231..e39fe77 100644
--- a/cpukit/score/include/rtems/score/rbtree.h
+++ b/cpukit/score/include/rtems/score/rbtree.h
@@ -484,6 +484,40 @@ void _RBTree_Replace_node(
 );
 
 /**
+ * @brief Inserts the node into the red-black tree.
+ *
+ * @param the_rbtree The red-black tree control.
+ * @param the_node The node to insert.
+ * @param less Must return true if the left node is less than the right the
+ *   node, otherwise false.
+ */
+RTEMS_INLINE_ROUTINE void _RBTree_Insert_inline(
+  RBTree_Control *the_rbtree,
+  RBTree_Node    *the_node,
+  bool         ( *less )( const RBTree_Node *, const RBTree_Node *)
+)
+{
+  RBTree_Node **link;
+  RBTree_Node  *parent;
+
+  link = _RBTree_Root_reference( the_rbtree );
+  parent = NULL;
+
+  while ( *link != NULL ) {
+    parent = *link;
+
+    if ( ( *less )( the_node, parent ) ) {
+      link = _RBTree_Left_reference( parent );
+    } else {
+      link = _RBTree_Right_reference( parent );
+    }
+  }
+
+  _RBTree_Add_child( the_node, parent, link );
+  _RBTree_Insert_color( the_rbtree, the_node );
+}
+
+/**
  * @brief Finds a node in the red-black tree with the specified key.
  *
  * @param the_rbtree The red-black tree control.
-- 
1.8.4.5




More information about the devel mailing list