Changeset 639117f in rtems


Ignore:
Timestamp:
07/22/14 12:50:07 (9 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, 5, master
Children:
4cd55724
Parents:
9113798c
git-author:
Sebastian Huber <sebastian.huber@…> (07/22/14 12:50:07)
git-committer:
Sebastian Huber <sebastian.huber@…> (07/26/14 10:01:25)
Message:

rbtree: Update maximum node in LIFO order

The test sptests/sp35 showed a NULL pointer access due to an invalid
maximum node field (e.g. a tree with one element and NULL as the maximum
node).

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/include/rtems/score/rbtree.h

    r9113798c r639117f  
    220220
    221221/**
    222  *  @brief Insert @a the_node on the Red-Black Tree @a the_rbtree.
    223  *
    224  *  This routine inserts @a the_node on the Red-Black Tree @a the_rbtree.
     222 * @brief Inserts the node into the red-black tree.
     223 *
     224 * In case the node is already a node of a tree, then this function yields
     225 * unpredictable results.
    225226 *
    226227 * @param[in] the_rbtree The red-black tree control.
     
    228229 * @param[in] compare The node compare function.
    229230 * @param[in] is_unique If true, then reject nodes with a duplicate key, else
    230  *   otherwise.
     231 *   insert nodes in FIFO order in case the key value is equal to existing nodes.
    231232 *
    232233 * @retval NULL Successfully inserted.
     
    488489
    489490/**
    490  * @brief Gets a node with an extremal key value.
     491 * @brief Gets a node with an extremal key value from the red-black tree.
    491492 *
    492493 * This function extracts a node with the minimum or maximum key value from
    493494 * tree and returns a pointer to that node if it exists.  In case multiple
    494  * nodes with an extremal key value exist, then they are extracted in FIFO
    495  * order.
     495 * nodes with a minimum key value exist, then they are extracted in FIFO order.
     496 * In case multiple nodes with a maximum key value exist, then they are
     497 * extracted in LIFO order.
    496498 *
    497499 * @param[in] the_rbtree The red-black tree control.
     
    500502 *
    501503 * @retval NULL The tree is empty.
    502  * @retval extremal_node A node with the minimal or maximal key value on the
     504 * @retval extremal_node A node with a minimal or maximal key value on the
    503505 *   tree.
    504506 */
  • cpukit/score/src/rbtreeinsert.c

    r9113798c r639117f  
    9797
    9898        if (
    99           ( !dir && _RBTree_Is_lesser( compare_result ) )
    100             || ( dir && _RBTree_Is_greater( compare_result ) )
     99          ( dir == RBT_LEFT && _RBTree_Is_lesser( compare_result ) )
     100            || ( dir == RBT_RIGHT && !_RBTree_Is_lesser( compare_result ) )
    101101        ) {
    102102          the_rbtree->first[ dir ] = the_node;
  • testsuites/sptests/sprbtree01/init.c

    r9113798c r639117f  
    2020rtems_task Init(rtems_task_argument argument);
    2121
    22 int numbers[20] = {
    23 52, 99, 0, 85, 43, 44, 10, 60, 50, 19, 8, 68, 48, 57, 17, 67, 90, 12, 77, 71};
    24 
    25 int numbers_sorted[20] = {
    26   0, 8, 10, 12, 17, 19, 43, 44, 48, 50, 52, 57, 60, 67, 68, 71, 77, 85, 90, 99};
     22static const int numbers[20] = {
     23  52, 99, 0, 85, 43, 44, 10, 60, 50, 19, 8, 68, 48, 57, 17, 67, 90, 12, 77, 71
     24};
     25
     26static const int numbers_sorted[20] = {
     27  0, 8, 10, 12, 17, 19, 43, 44, 48, 50, 52, 57, 60, 67, 68, 71, 77, 85, 90, 99
     28};
    2729
    2830typedef struct {
     
    122124}
    123125
    124 
    125 
    126 rtems_task Init(
    127     rtems_task_argument ignored
    128     )
     126static test_node some_nodes[] = {
     127  { .key = 1 },
     128  { .key = 1 },
     129  { .key = 1 },
     130  { .key = 2 },
     131  { .key = 2 },
     132  { .key = 2 }
     133};
     134
     135static void min_max_insert(
     136  rtems_rbtree_control *tree,
     137  rtems_rbtree_node    *node,
     138  rtems_rbtree_node    *min,
     139  rtems_rbtree_node    *max
     140)
     141{
     142  rb_insert_multi( tree, node );
     143  rtems_test_assert( rb_assert( tree->root ) != -1 );
     144  rtems_test_assert( tree->first[ 0 ] == min );
     145  rtems_test_assert( tree->first[ 1 ] == max );
     146}
     147
     148static void min_max_extract(
     149  rtems_rbtree_control *tree,
     150  rtems_rbtree_node    *node,
     151  rtems_rbtree_node    *min,
     152  rtems_rbtree_node    *max
     153)
     154{
     155  rtems_rbtree_extract( tree, node );
     156  rtems_test_assert( rb_assert( tree->root ) != -1 );
     157  rtems_test_assert( tree->first[ 0 ] == min );
     158  rtems_test_assert( tree->first[ 1 ] == max );
     159}
     160
     161static void test_rbtree_min_max(void)
     162{
     163  rtems_rbtree_control  tree;
     164  rtems_rbtree_node    *node;
     165  rtems_rbtree_node    *min;
     166  rtems_rbtree_node    *max;
     167
     168  puts( "INIT - Verify min/max node updates" );
     169
     170  rtems_rbtree_initialize_empty( &tree );
     171  rtems_test_assert( rb_assert( tree.root ) == 1 );
     172
     173  node = &some_nodes[ 0 ].Node;
     174  min = node;
     175  max = node;
     176  min_max_insert( &tree, node, min, max );
     177
     178  node = &some_nodes[ 1 ].Node;
     179  max = node;
     180  min_max_insert( &tree, node, min, max );
     181
     182  node = &some_nodes[ 2 ].Node;
     183  max = node;
     184  min_max_insert( &tree, node, min, max );
     185
     186  node = &some_nodes[ 3 ].Node;
     187  max = node;
     188  min_max_insert( &tree, node, min, max );
     189
     190  node = &some_nodes[ 4 ].Node;
     191  max = node;
     192  min_max_insert( &tree, node, min, max );
     193
     194  node = &some_nodes[ 5 ].Node;
     195  max = node;
     196  min_max_insert( &tree, node, min, max );
     197
     198  node = &some_nodes[ 1 ].Node;
     199  min_max_extract( &tree, node, min, max );
     200
     201  node = &some_nodes[ 4 ].Node;
     202  min_max_extract( &tree, node, min, max );
     203
     204  node = &some_nodes[ 0 ].Node;
     205  min = &some_nodes[ 2 ].Node;
     206  min_max_extract( &tree, node, min, max );
     207
     208  node = &some_nodes[ 5 ].Node;
     209  max = &some_nodes[ 3 ].Node;
     210  min_max_extract( &tree, node, min, max );
     211
     212  node = &some_nodes[ 2 ].Node;
     213  min = &some_nodes[ 3 ].Node;
     214  min_max_extract( &tree, node, min, max );
     215
     216  node = &some_nodes[ 3 ].Node;
     217  min = NULL;
     218  max = NULL;
     219  min_max_extract( &tree, node, min, max );
     220  rtems_test_assert( rtems_rbtree_is_empty( &tree ) );
     221}
     222
     223rtems_task Init( rtems_task_argument ignored )
    129224{
    130225  rtems_rbtree_control  rbtree1;
     
    683778  }
    684779
     780  test_rbtree_min_max();
     781
    685782  TEST_END();
    686783  rtems_test_exit(0);
  • testsuites/sptests/sprbtree01/sprbtree01.scn

    r9113798c r639117f  
    1 *** TEST OF RTEMS RBTREE API ***
     1*** BEGIN OF TEST SPRBTREE 1 ***
    22Init - Initialize rbtree empty
    33INIT - Verify rtems_rbtree_insert with two nodes
     
    3232INIT - Verify rtems_rbtree_find in a duplicate tree
    3333INIT - Removing 100 nodes
    34 *** END OF RTEMS RBTREE API TEST ***
     34INIT - Verify min/max node updates
     35*** END OF TEST SPRBTREE 1 ***
Note: See TracChangeset for help on using the changeset viewer.