void test_fast_read_set04(CuTest *tc){
    short int i, j;
    fast_read_set set;
    printf("\nFast-read-set test#04 - elements 0-19: unique_insert\nmarked: 0-14 repeated 50 times\narray read by is_marked:\n");
    construct_fast_read_set(&set, 20);
    for(j = 0; j < 50; ++j){
        for(i = 0; i < 15; ++i){
            set_mark(&set, i);
        }
    }
    for(i = 0; i < 20; ++i){
        printf("%d ", (int)is_marked(&set, i));
    }
    printf("\n\tThere should be no repetitions in the tree;\t");
    RB_display_keys_in_order(&set.tree);

    reset_marks(&set);
    printf("Now all cells should be reset:\n");
    for(i = 0; i < 20; ++i){
        printf("%d ", (int)is_marked(&set, i));
    }
    printf("\n");
    RB_display_keys_in_order(&set.tree);

    destroy_fast_read_set(&set);
}
void test_fast_read_set03(CuTest *tc){
    short int i;
    fast_read_set set;
    printf("\nFast-read-set test#03 - elements 0-19: reset\nmarked: 0-9, 12, 15, 17, 19\narray read by is_marked:\n");
    construct_fast_read_set(&set, 20);
    for(i = 0; i < 10; ++i){
        set_mark(&set, i);
    }
    set_mark(&set, 12);
    set_mark(&set, 19);
    set_mark(&set, 17);
    set_mark(&set, 15);
    for(i = 0; i < 20; ++i){
        printf("%d ", (int)is_marked(&set, i));
    }
    printf("\n");
    RB_display_keys_in_order(&set.tree);


    reset_marks(&set);


    printf("\tNow all cells should be reset:\n");
    for(i = 0; i < 20; ++i){
        printf("%d ", (int)is_marked(&set, i));
    }
    printf("\n");
    RB_display_keys_in_order(&set.tree);
    destroy_fast_read_set(&set);
}
Exemple #3
0
void find_next_collision(level_data *level, short int index,
                         fast_read_set *primitive_done, fast_read_set *movable_done, long double time_passed){
    collision_data new_coll;
    int i, j, k;
    level->movable_objects[index].coll_with_fixed.time = EMPTY_COLLISION_TIME;
    for(i = level->movable_objects[index].zones[0]; i <= level->movable_objects[index].zones[2]; ++i){
        for(j = level->movable_objects[index].zones[1]; j <= level->movable_objects[index].zones[3]; ++j){
            for(k = 0; k < level->zones[i][j].number_of_primitives; ++k){
                if(!is_marked(primitive_done, level->zones[i][j].primitives[k])){
                    set_mark(primitive_done, level->zones[i][j].primitives[k]);
                    new_coll = get_collision_with_primitive(&level->movable_objects[index],
                                                            &level->primitive_objects[level->zones[i][j].primitives[k]]);
                    new_coll.time += time_passed;
                    if(new_coll.time >= 0 && new_coll.time <= 1){
                        if(new_coll.time < level->movable_objects[index].coll_with_fixed.time){
                            new_coll.who = index;
                            new_coll.with = level->zones[i][j].primitives[k];
                            level->movable_objects[index].coll_with_fixed = new_coll;
                        }
                    }
                }
            }
        }
    }
    reset_marks(primitive_done);

    set_mark(movable_done, index);
    for(i = level->movable_objects[index].zones[0]; i <= level->movable_objects[index].zones[2]; ++i){
        for(j = level->movable_objects[index].zones[1]; j <= level->movable_objects[index].zones[3]; ++j){
            in_order_check_collision(level, movable_done,
                                            index,
                                            level->zones[i][j].movable.root,
                                            level->zones[i][j].movable.nil,
                                            time_passed);
        }
    }
    reset_marks(movable_done);

    collision_min_for_object(level, index);

    //push on queue  //heap checks if who < with and does necessary exchanges
    if(level->movable_objects[index].next_collision->time <= 1 &&
       level->movable_objects[index].next_collision->time >= 0){
        heap_insert(&level->collision_queue, level->movable_objects[index].next_collision);
    }
}
int main(int argc, char **argv)
{
    populate_device(argc, argv);
    reset_marks(TOTAL_MARKS);

    int ret;

    int pid = fork();
    if (pid == 0) {
        printv("Child sleeping for 3 seconds\n");
        sleep(3);
        printv("Child creating buffer\n");
        ret = create_buffer(1);
        printv("Child finished, exiting with status %d\n", ret);
        _exit(ret);
    } else {
        printv("Parent creating buffer\n");
        ret = create_buffer(0);
        if (ret == 0) {
            update_marks(1);
        }
        if (ret != 4) {
            device_dirty = true;
        }

        int status;
        wait(&status);
        if (WIFEXITED(status)) {
            int child_ret = WEXITSTATUS(status);
            printv("Child returned status %d\n", child_ret);
            if (child_ret == 0) {
                update_marks(1);
            }
            if (ret != 4) {
                device_dirty = true;
            }
        }
    }

    /* only the parent gets here */
    return end_marks();
}
int main(int argc, char **argv)
{
    populate_device(argc, argv);
    reset_marks(TOTAL_MARKS);

    /* 1 mark: open. Device must be able to be opened for reading, writing and
     * reading/writing to get this mark.
     */
    int fd = open_rdrw();
    if (fd < 0) {
        try_close(fd, false);
        goto end;
    }

    fd = open_rdonly();
    if (fd < 0) {
        try_close(fd, false);
        goto end;
    }

    fd = open_wronly();
    if (fd < 0) {
        try_close(fd, false);
        goto end;
    }

    /* fork another process and try the opens again */
    char *arg0 = "./test_1a_open_close";
    printv("Now forking to run %s\n", arg0);
    int pid = fork();
    if (pid == 0) {
        /* get rid of stdout */
        int null_fd = open("/dev/null", O_WRONLY);
        if (null_fd < 0) {
            printe("open(\"/dev/null\")");
            _exit(ERR_EXEC);
        }
        if (dup2(null_fd, STDOUT_FILENO) < 0) {
            printe("dup2()");
            _exit(ERR_EXEC);
        }

        /* execute the single open/close test */
        execl(arg0, arg0, device_node, NULL);
        printe("execl()");
        _exit(ERR_EXEC);
    } else {
        int status;
        wait(&status);
        if (WIFEXITED(status)) {
            int ret = WEXITSTATUS(status);
            if (ret == 0) {
                printv("Child returned success\n");
                update_marks(1);
            } else {
                printv("Child returned non-zero status (%d)\n", ret);
            }
        }
        try_close(fd, true);
        goto end;
    }

end:
    return end_marks();
}