--- 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 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel