12
12
* All rights reserved.
13
13
* Copyright (c) 2015-2018 Los Alamos National Security, LLC. All rights
14
14
* reserved.
15
+ * Copyright (c) 2020 Google, LLC. All rights reserved.
15
16
* $COPYRIGHT$
16
17
*
17
18
* Additional copyrights may follow
@@ -39,7 +40,7 @@ static opal_interval_tree_node_t *opal_interval_tree_next (opal_interval_tree_t
39
40
opal_interval_tree_node_t * node );
40
41
static opal_interval_tree_node_t * opal_interval_tree_find_node (opal_interval_tree_t * tree ,
41
42
uint64_t low , uint64_t high ,
42
- bool exact , void * data );
43
+ void * data );
43
44
44
45
static opal_interval_tree_node_t * left_rotate (opal_interval_tree_t * tree , opal_interval_tree_node_t * x );
45
46
static opal_interval_tree_node_t * right_rotate (opal_interval_tree_t * tree , opal_interval_tree_node_t * x );
@@ -355,31 +356,54 @@ int opal_interval_tree_insert (opal_interval_tree_t *tree, void *value, uint64_t
355
356
return OPAL_SUCCESS ;
356
357
}
357
358
359
+ static int opal_interval_tree_compare_node (opal_interval_tree_node_t * node , uint64_t low , uint64_t high , void * data ) {
360
+ if ((data && node -> low == low && node -> high == high && node -> data == data ) ||
361
+ (!data && node -> low <= low && node -> high >= high )) {
362
+ return 0 ;
363
+ }
364
+ if (node -> low > low ) {
365
+ return -1 ;
366
+ }
367
+ if (node -> low < low ) {
368
+ return 1 ;
369
+ }
370
+ if (node -> high < high ) {
371
+ return -1 ;
372
+ }
373
+ if (node -> high > high ) {
374
+ return 1 ;
375
+ }
376
+ if (node -> data > data ) {
377
+ return -1 ;
378
+ }
379
+ return 1 ;
380
+ }
381
+
358
382
static opal_interval_tree_node_t * opal_interval_tree_find_interval (opal_interval_tree_t * tree , opal_interval_tree_node_t * node , uint64_t low ,
359
- uint64_t high , bool exact , void * data )
383
+ uint64_t high , void * data )
360
384
{
361
385
if (node == & tree -> nill ) {
362
386
return NULL ;
363
387
}
364
388
365
- if ((( exact && node -> low == low && node -> high == high ) || (! exact && node -> low <= low && node -> high >= high )) &&
366
- (! data || node -> data == data ) ) {
389
+ int check = opal_interval_tree_compare_node ( node , low , high , data );
390
+ if ( 0 == check ) {
367
391
return node ;
368
392
}
369
393
370
- if (low <= node -> low ) {
371
- return opal_interval_tree_find_interval (tree , node -> left , low , high , exact , data );
394
+ if (-1 == check ) {
395
+ return opal_interval_tree_find_interval (tree , node -> left , low , high , data );
372
396
}
373
397
374
- return opal_interval_tree_find_interval (tree , node -> right , low , high , exact , data );
398
+ return opal_interval_tree_find_interval (tree , node -> right , low , high , data );
375
399
}
376
400
377
401
/* Finds the node in the tree based on the key and returns a pointer
378
402
* to the node. This is a bit a code duplication, but this has to be fast
379
403
* so we go ahead with the duplication */
380
- static opal_interval_tree_node_t * opal_interval_tree_find_node (opal_interval_tree_t * tree , uint64_t low , uint64_t high , bool exact , void * data )
404
+ static opal_interval_tree_node_t * opal_interval_tree_find_node (opal_interval_tree_t * tree , uint64_t low , uint64_t high , void * data )
381
405
{
382
- return opal_interval_tree_find_interval (tree , tree -> root .left , low , high , exact , data );
406
+ return opal_interval_tree_find_interval (tree , tree -> root .left , low , high , data );
383
407
}
384
408
385
409
void * opal_interval_tree_find_overlapping (opal_interval_tree_t * tree , uint64_t low , uint64_t high )
@@ -388,7 +412,7 @@ void *opal_interval_tree_find_overlapping (opal_interval_tree_t *tree, uint64_t
388
412
opal_interval_tree_node_t * node ;
389
413
390
414
token = opal_interval_tree_reader_get_token (tree );
391
- node = opal_interval_tree_find_node (tree , low , high , true, NULL );
415
+ node = opal_interval_tree_find_node (tree , low , high , NULL );
392
416
opal_interval_tree_reader_return_token (tree , token );
393
417
394
418
return node ? node -> data : NULL ;
@@ -536,7 +560,7 @@ int opal_interval_tree_delete (opal_interval_tree_t *tree, uint64_t low, uint64_
536
560
opal_interval_tree_node_t * node ;
537
561
538
562
opal_interval_tree_write_lock (tree );
539
- node = opal_interval_tree_find_node (tree , low , high , true, data );
563
+ node = opal_interval_tree_find_node (tree , low , high , data );
540
564
if (NULL == node ) {
541
565
opal_interval_tree_write_unlock (tree );
542
566
return OPAL_ERR_NOT_FOUND ;
@@ -618,18 +642,23 @@ static void opal_interval_tree_insert_node (opal_interval_tree_t *tree, opal_int
618
642
node -> right = nill ;
619
643
620
644
/* find the leaf where we will insert the node */
645
+ int check = -1 ;
621
646
while (n != nill ) {
647
+ check = opal_interval_tree_compare_node (n , node -> low , node -> high , node -> data );
648
+ /* node already exists */
649
+ assert (0 != check );
650
+
622
651
if (n -> max < node -> high ) {
623
652
n -> max = node -> high ;
624
653
}
625
654
626
655
parent = n ;
627
- n = (( node -> low < n -> low ) ? n -> left : n -> right ) ;
656
+ n = (-1 == check ) ? n -> left : n -> right ;
628
657
assert (nill == n || n -> parent == parent );
629
658
}
630
659
631
660
/* place it on either the left or the right */
632
- if (( node -> low < parent -> low ) ) {
661
+ if (-1 == check ) {
633
662
parent -> left = node ;
634
663
} else {
635
664
parent -> right = node ;
0 commit comments