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); }
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, ¤t); } 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; }
void test_new() { multilevel_queue_t q; q = multilevel_queue_new(4); assert(multilevel_queue_length(q) == 0); assert(multilevel_queue_free(q) == 0); }