Esempio n. 1
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);
}
Esempio n. 2
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);
}
/*
 * Idle / System thread body
 */
int minithread_idle() {
	while ( multilevel_queue_length(ready_queue) || queue_length(stop_queue) 
		|| queue_length(dead_queue) || alarm_has_ready() ) {
		while ( alarm_has_ready() ) {
			alarm_fire_next();
		}
		while ( queue_length(dead_queue) ) {
			minithread_t kill_thread;
			queue_dequeue(dead_queue, &kill_thread);
			minithread_free(kill_thread);
		}
		if ( multilevel_queue_length(ready_queue) ) {
			minithread_schedule();
		}
	}
	
	return 0;
}
/*
 * Scheduler
 */
int minithread_schedule() {
	minithread_t old = current;
	if ( alarm_has_ready() && old != idle ) {
		current = idle;
	} else if(multilevel_queue_length(ready_queue)>0) {
		minithread_age(ready_queue);
		multilevel_queue_dequeue(ready_queue, PRIORITY_SHORT, &current);
	} else {
		current = idle;
	}

	if ( current->priority == PRIORITY_SHORT ) {
		current_quanta_end = ticks + SHORT_QUANTA;
	} else {
		current_quanta_end = ticks + LONG_QUANTA;
	}
	minithread_switch(&(old->sp), &(current->sp));
	return 0;
}
Esempio n. 5
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);
}