RBTree_Node *_RBTree_Insert( RBTree_Control *the_rbtree, RBTree_Node *the_node, RBTree_Compare compare, bool is_unique ) { RBTree_Node **which = _RBTree_Root_reference( the_rbtree ); RBTree_Node *parent = NULL; while ( *which != NULL ) { RBTree_Compare_result compare_result; parent = *which; compare_result = ( *compare )( the_node, parent ); if ( is_unique && _RBTree_Is_equal( compare_result ) ) { return parent; } if ( _RBTree_Is_lesser( compare_result ) ) { which = _RBTree_Left_reference( parent ); } else { which = _RBTree_Right_reference( parent ); } } _RBTree_Add_child( the_node, parent, which ); _RBTree_Insert_color( the_rbtree, the_node ); return NULL; }
void _Watchdog_Insert( Watchdog_Header *header, Watchdog_Control *the_watchdog, uint64_t expire ) { RBTree_Node **link; RBTree_Node *parent; RBTree_Node *old_first; RBTree_Node *new_first; _Assert( _Watchdog_Get_state( the_watchdog ) == WATCHDOG_INACTIVE ); link = _RBTree_Root_reference( &header->Watchdogs ); parent = NULL; old_first = header->first; new_first = &the_watchdog->Node.RBTree; the_watchdog->expire = expire; while ( *link != NULL ) { Watchdog_Control *parent_watchdog; parent = *link; parent_watchdog = (Watchdog_Control *) parent; if ( expire < parent_watchdog->expire ) { link = _RBTree_Left_reference( parent ); } else { link = _RBTree_Right_reference( parent ); new_first = old_first; } } header->first = new_first; _RBTree_Add_child( &the_watchdog->Node.RBTree, parent, link ); _RBTree_Insert_color( &header->Watchdogs, &the_watchdog->Node.RBTree ); }