Exemplo n.º 1
0
/* insert into the tree using an array of uint32 as a key */
void 
trbt_insertarray32_callback(trbt_tree_t *tree, uint32_t keylen, uint32_t *key, void *(*cb)(void *param, void *data), void *pm)
{
	struct trbt_array_param tap;

	/* keylen-1 and key[1]  since the call to insert32 will consume the
	   first part of the key.
	*/
	tap.callback= cb;
	tap.param   = pm;
	tap.keylen  = keylen-1;
	tap.key     = &key[1];
	tap.tree    = tree;

	trbt_insert32_callback(tree, key[0], array_insert_callback, &tap);
}
Exemplo n.º 2
0
Arquivo: rb_test.c Projeto: GSam/samba
/*
  main program
*/
int main(int argc, const char *argv[])
{
    int traverse_count;
    int i,j,k;
    trbt_tree_t *tree;
    uint32_t *data;
    uint32_t key[3];
    uint32_t key1[3] = {0,10,20};
    uint32_t key2[3] = {0,10,21};
    uint32_t key3[3] = {0,11,20};
    uint32_t key4[3] = {2,10,20};
    TALLOC_CTX *memctx;
    uint32_t **u32array;
    uint32_t checksum;

    /* testing trbt_insert32_callback for num_records */
    memctx   = talloc_new(NULL);
    assert(memctx != NULL);

    u32array = talloc_array(memctx, uint32_t *, num_records);
    assert(u32array != NULL);

    tree = trbt_create(memctx, 0);
    assert(tree != NULL);

    for (i=0; i<num_records; i++) {
        u32array[i]  = talloc(u32array, uint32_t);
        assert(u32array[i] != NULL);
        *u32array[i] = 0;
        trbt_insert32_callback(tree, i, callback, u32array[i]);
    }
    for (i=3; i<num_records; i++) {
        trbt_insert32_callback(tree, i, callback, NULL);
    }

    /* first 3 keys should have data == 1
     * the rest of the keys should have data == 2
     */
    for (i=0; i<num_records; i++) {
        data = trbt_lookup32(tree, i);
        if (i < 3) {
            assert(*data == 1);
        } else {
            assert(*data == 2);
        }
    }

    /* deleting key 2 */
    talloc_free(u32array[2]);

    /* deleting key 1 */
    talloc_free(u32array[1]);

    assert(talloc_total_size(memctx) == 212);

    /* freeing tree */
    talloc_free(memctx);


    printf("testing trbt_insertarray32_callback\n");
    memctx   = talloc_new(NULL);
    assert(memctx != NULL);

    tree = trbt_create(memctx, 0);
    assert(tree != NULL);

    u32array = talloc_array(memctx, uint32_t *, 4);
    assert(u32array != NULL);

    for (i=0; i<4; i++) {
        u32array[i]  = talloc(u32array, uint32_t);
        assert(u32array[i] != NULL);
        *u32array[i] = 0;
    }

    trbt_insertarray32_callback(tree, 3, key1, callback, u32array[0]);
    trbt_insertarray32_callback(tree, 3, key1, callback, u32array[0]);
    trbt_insertarray32_callback(tree, 3, key2, callback, u32array[1]);
    trbt_insertarray32_callback(tree, 3, key3, callback, u32array[2]);
    trbt_insertarray32_callback(tree, 3, key2, callback, u32array[1]);
    trbt_insertarray32_callback(tree, 3, key1, callback, u32array[0]);

    data = trbt_lookuparray32(tree, 3, key1);
    assert(data != NULL && *data == 3);
    data = trbt_lookuparray32(tree, 3, key2);
    assert(data != NULL && *data == 2);
    data = trbt_lookuparray32(tree, 3, key3);
    assert(data != NULL && *data == 1);
    data = trbt_lookuparray32(tree, 3, key4);
    assert(data == NULL);
    trbt_traversearray32(tree, 3, traverse, NULL);

    printf("\ndeleting key4\n");
    talloc_free(trbt_lookuparray32(tree, 3, key4));

    data = trbt_lookuparray32(tree, 3, key1);
    assert(data != NULL && *data == 3);
    data = trbt_lookuparray32(tree, 3, key2);
    assert(data != NULL && *data == 2);
    data = trbt_lookuparray32(tree, 3, key3);
    assert(data != NULL && *data == 1);
    data = trbt_lookuparray32(tree, 3, key4);
    assert(data == NULL);
    trbt_traversearray32(tree, 3, traverse, NULL);

    printf("\ndeleting key2\n");
    talloc_free(trbt_lookuparray32(tree, 3, key2));

    data = trbt_lookuparray32(tree, 3, key1);
    assert(data != NULL && *data == 3);
    data = trbt_lookuparray32(tree, 3, key2);
    assert(data == NULL);
    data = trbt_lookuparray32(tree, 3, key3);
    assert(data != NULL && *data == 1);
    data = trbt_lookuparray32(tree, 3, key4);
    assert(data == NULL);
    trbt_traversearray32(tree, 3, traverse, NULL);

    printf("\ndeleting key3\n");
    talloc_free(trbt_lookuparray32(tree, 3, key3));

    data = trbt_lookuparray32(tree, 3, key1);
    assert(data != NULL && *data == 3);
    data = trbt_lookuparray32(tree, 3, key2);
    assert(data == NULL);
    data = trbt_lookuparray32(tree, 3, key3);
    assert(data == NULL);
    data = trbt_lookuparray32(tree, 3, key4);
    assert(data == NULL);
    trbt_traversearray32(tree, 3, traverse, NULL);

    printf("\ndeleting key1\n");
    talloc_free(trbt_lookuparray32(tree, 3, key1));

    data = trbt_lookuparray32(tree, 3, key1);
    assert(data == NULL);
    data = trbt_lookuparray32(tree, 3, key2);
    assert(data == NULL);
    data = trbt_lookuparray32(tree, 3, key3);
    assert(data == NULL);
    data = trbt_lookuparray32(tree, 3, key4);
    assert(data == NULL);
    trbt_traversearray32(tree, 3, traverse, NULL);

    talloc_free(tree);
    talloc_free(memctx);


    printf("\nrun random insert and delete for 60 seconds\n");
    memctx   = talloc_new(NULL);
    assert(memctx != NULL);

    tree = trbt_create(memctx, 0);
    assert(tree != NULL);

    i=0;
    start_timer();
    checksum = 0;
    /* add and delete nodes from a 3 level tree fro 60 seconds.
       each time a node is added or deleted, traverse the tree and
       compute a checksum over the data stored in the tree and compare this
       with a checksum we keep which contains what the checksum should be
     */
    while(end_timer() < 60.0) {
        char *str;

        i++;
        key[0]=random()%10;
        key[1]=random()%10;
        key[2]=random()%10;

        if (random()%2) {
            if (trbt_lookuparray32(tree, 3, key) == NULL) {
                /* this node does not yet exist, add it to the
                   tree and update the checksum
                 */
                str=talloc_asprintf(memctx, "%d.%d.%d", key[0],key[1],key[2]);
                trbt_insertarray32_callback(tree, 3, key, random_add, str);
                checksum += key[0]*100+key[1]*10+key[2];
            }
        } else {
            if ((str=trbt_lookuparray32(tree, 3, key)) != NULL) {
                /* this node does exist in  the tree, delete
                   it and update the checksum accordingly
                 */
                talloc_free(str);
                checksum -= key[0]*100+key[1]*10+key[2];
            }
        }
        /* traverse all nodes in the tree and calculate the checksum
           it better match the one we keep track of in
           'checksum'
        */
        calc_checksum = 0;
        trbt_traversearray32(tree, 3, traverse_checksum, NULL);
        assert(checksum == calc_checksum);
    }

    /*
    printf("\niterations passed:%d\n", i);
    trbt_traversearray32(tree, 3, random_traverse, NULL);
    printf("\n");
    printf("first node: %s\n", (char *)trbt_findfirstarray32(tree, 3));
    */

    traverse_count = 0;
    trbt_traversearray32(tree, 3, count_traverse, &traverse_count);
    assert(traverse_count > 0);

    traverse_count = 0;
    trbt_traversearray32(tree, 3, count_traverse_abort, &traverse_count);
    assert(traverse_count == 1);

    printf("\ndeleting all entries\n");
    for(i=0; i<10; i++) {
        for(j=0; j<10; j++) {
            for(k=0; k<10; k++) {
                key[0]=i;
                key[1]=j;
                key[2]=k;
                talloc_free(trbt_lookuparray32(tree, 3, key));
            }
        }
    }
    trbt_traversearray32(tree, 3, random_traverse, NULL);

    assert(talloc_total_size(memctx) == 16);

    return 0;
}