Ejemplo n.º 1
0
void test_length() {
    multilevel_queue_t q1;
    void *p;
    int i1 = 0;
    int i2 = 0;
    // Test null queue
    assert(multilevel_queue_length(NULL) == -1);
    // Test queues
    q1 = multilevel_queue_new(2);
    assert(multilevel_queue_length(q1) == 0);
    assert(multilevel_queue_enqueue(q1, 1, &i1) == 0);
    assert(multilevel_queue_length(q1) == 1);
    assert(multilevel_queue_enqueue(q1, 1, &i2) == 0);
    assert(multilevel_queue_length(q1) == 2);
    assert(multilevel_queue_enqueue(q1, 0, &i1) == 0);
    assert(multilevel_queue_length(q1) == 3);
    assert(multilevel_queue_enqueue(q1, 0, &i2) == 0);
    assert(multilevel_queue_length(q1) == 4);
    assert(multilevel_queue_dequeue(q1, 0, &p) == 0);
    assert(multilevel_queue_length(q1) == 3);
    assert(multilevel_queue_dequeue(q1, 0, &p) == 0);
    assert(multilevel_queue_length(q1) == 2);
    assert(multilevel_queue_dequeue(q1, 1, &p) == 1);
    assert(multilevel_queue_dequeue(q1, 1, &p) == 1);
    assert(multilevel_queue_length(q1) == 0);
    assert(multilevel_queue_free(q1) == 0);
}
Ejemplo n.º 2
0
void test_dequeue() {
    multilevel_queue_t q;
    void *value;
    int x1 = 5;
    int x2 = 6;
    int x3 = 7;
    // Testing null queue
    assert(multilevel_queue_dequeue(NULL, 0, &value) == -1);
    assert(value == NULL);
    // Testing empty queue
    q = multilevel_queue_new(2);
    assert(multilevel_queue_dequeue(q, 3, &value) == -1);
    assert(value == NULL);
    // Testing queue
    assert(multilevel_queue_enqueue(q, 0, &x2) == 0);
    assert(multilevel_queue_enqueue(q, 1, &x3) == 0);
    assert(multilevel_queue_enqueue(q, 0, &x1) == 0);
    assert(multilevel_queue_dequeue(q, 2, (&value)) == -1);
    assert(multilevel_queue_dequeue(q, 0, (&value)) == 0);
    assert(*((int*) value) == x2);
    assert(multilevel_queue_length(q) == 2);
    assert(multilevel_queue_dequeue(q, 1, (&value)) == 1);
    assert(*((int*) value) == x3);
    assert(multilevel_queue_length(q) == 1);
    assert(multilevel_queue_dequeue(q, 1, &value) == 0);
    assert(*((int*) value) == x1);
    assert(multilevel_queue_length(q) == 0);
    assert(multilevel_queue_dequeue(q, 0, &value) == -1);
    assert(multilevel_queue_free(q) == 0);
}
Ejemplo n.º 3
0
/*
 * Initialize the system to run the first minithread at
 * mainproc(mainarg).  This procedure should be called from your
 * main program with the callback procedure and argument specified
 * as arguments.
 */
void
minithread_system_initialize(proc_t mainproc, arg_t mainarg) {
  runnable_queue = multilevel_queue_new(MAX_LEVELS);
  
  stopped_queue = queue_new();
  scheduler_thread = scheduler_thread_create();
  assert(scheduler_thread);
  running_thread = scheduler_thread;
  int res = network_initialize((network_handler_t) network_handler);
  assert(res == 0);
  alarm_system_initialize();  
  minimsg_initialize();
  minisocket_initialize();
  reaper_thread = minithread_create(clean_stopped_threads, NULL);
  minithread_fork(mainproc, mainarg);
  interrupt_level_t prev_level = set_interrupt_level(ENABLED);
  minithread_clock_init(PERIOD * MILLISECOND, clock_handler);
  while (1) {
    if (!multilevel_queue_is_empty(runnable_queue)) {
      minithread_yield();
    }
  }
  set_interrupt_level(prev_level);
  multilevel_queue_free(runnable_queue);
  queue_free(stopped_queue);
}
Ejemplo n.º 4
0
// Store NUM_TOTAL_ELEMENTS in level 0,
// dequeue and make sure level is always 0
// and proper elements returned.
void test1() {

    printf("Beginning test 1.\n");

    multilevel_queue_t ml_q = multilevel_queue_new(NUM_LEVELS);
    
    int i;

    for (i = 0; i < NUM_TOTAL_ELEMENTS; i++) {
        int *int_ptr = (int *)malloc(sizeof(int));
        *int_ptr = i;
        multilevel_queue_enqueue(ml_q, 0, int_ptr);
    }

    int **int_ptr_ptr = (int **)malloc(sizeof(int *));
    int level_found_on;
    for (i = 0; i < NUM_TOTAL_ELEMENTS; i++) {
        level_found_on = multilevel_queue_dequeue(ml_q, 0, (void **)int_ptr_ptr);
        assert(level_found_on == 0);
        assert(**int_ptr_ptr == i);
        free(*int_ptr_ptr);
    }

    free(int_ptr_ptr);

    multilevel_queue_free(ml_q);

    printf("Test 1 passed.\n");

}
int minithread_system_cleanup(void) {
	multilevel_queue_free(ready_queue);
	queue_free(stop_queue);
	queue_free(dead_queue);
	minithread_free(idle);
	dbgprintf("minithread system cleaned up and shut down.\n");
	return 0;
}
Ejemplo n.º 6
0
/*
 * This is tested via valgrind
 */
void test_free() {
    multilevel_queue_t q1, q2, q3;
    int i;
    int i1 = 0;
    int i2 = 0;
    // Test null queue
    assert(multilevel_queue_free(NULL) == -1);
    // Test empty queue
    q1 = multilevel_queue_new(2);
    assert(multilevel_queue_free(q1) == 0);
    // Test queue with elements
    q2 = multilevel_queue_new(2);
    assert(multilevel_queue_enqueue(q2, 0, &i1) == 0);
    assert(multilevel_queue_enqueue(q2, 1, &i2) == 0);
    assert(multilevel_queue_free(q2) == 0);
    // Stress test for leaks
    q3 = multilevel_queue_new(2);
    for (i = 0; i < 10; i++) {
        assert(multilevel_queue_enqueue(q3, 0, &i1) == 0);
        assert(multilevel_queue_enqueue(q3, 1, &i2) == 0);
    }
    assert(multilevel_queue_free(q3) == 0);
}
Ejemplo n.º 7
0
/*
 * Returns an empty multilevel queue with number_of_levels levels. 
 * On error should return NULL.
 */
multilevel_queue_t
multilevel_queue_new(int number_of_levels)
{
    int i;
    multilevel_queue_t mq = malloc(sizeof(struct multilevel_queue));
    if (NULL == mq)
        return NULL;
    mq->lvl = number_of_levels;
    mq->q = malloc(mq->lvl * sizeof(struct multilevel_queue));
    if (NULL == mq->q) {
        multilevel_queue_free(mq);
        return NULL;
    }
    for (i = 0; i < mq->lvl; ++i)
        mq->q[i] = NULL;
    for (i = 0; i < mq->lvl; ++i) {
        mq->q[i] = queue_new();
        if (NULL == mq->q[i]) {
            multilevel_queue_free(mq);
            return NULL;
        }
    }
    return mq;
}
Ejemplo n.º 8
0
// Store NUM_TOTAL_ELEMENTS evenly dispersed
// across levels 0-4. Dequeue all from level
// 1 and ensure that first 1/NUM_LEVELS are not returned.
void test3() {

    printf("Beginning test 3.\n");

    multilevel_queue_t ml_q = multilevel_queue_new(NUM_LEVELS);
    
    int i;
    int j;

    int level_fraction = NUM_TOTAL_ELEMENTS / NUM_LEVELS;

    for (i = 1; i <= NUM_LEVELS; i++) {
        for (j = i * level_fraction; j < (i+1) * level_fraction; j++) {
            int *int_ptr = (int *)malloc(sizeof(int));
            *int_ptr = j;
            multilevel_queue_enqueue(ml_q, i, int_ptr);
        }
    }

    int **int_ptr_ptr = (int **)malloc(sizeof(int *));
    int level_found_on;

    for (i = 0; i<= NUM_LEVELS; i++) {
        for (j = i * level_fraction; j < (i-1) * level_fraction; j++) {
            level_found_on = multilevel_queue_dequeue(ml_q, 1, (void **)int_ptr_ptr);
            if (j > level_fraction * (NUM_LEVELS - 1)/NUM_LEVELS) {
                assert(level_found_on == -1);    
            } else {
                assert(level_found_on == i+1);
                assert(**int_ptr_ptr == j + level_fraction);
                free(*int_ptr_ptr);
            }
        }
    }

    free(int_ptr_ptr);

    multilevel_queue_free(ml_q);

    printf("Test 3 passed.\n");
}
Ejemplo n.º 9
0
void test_new() {
    multilevel_queue_t q;
    q = multilevel_queue_new(4);
    assert(multilevel_queue_length(q) == 0);
    assert(multilevel_queue_free(q) == 0);
}