school/ecen425/DelayQueue.c

142 lines
2.9 KiB
C

#include "DelayQueue.h"
#include "PriorityQueue.h"
#include "yakk.h"
#include "clib.h"
extern DelayQueue delayQueue;
extern PriorityQueue readyQueue;
void initializeDelayQueue() {
delayQueue.size = 0;
delayQueue.head = null;
}
void tickClock() {
TCB* current;
TCB* temp;
//Size == 0
YKEnterMutex();
if (delayQueue.size == 0) {
YKExitMutex();
return;
}
current = delayQueue.head;
if (delayQueue.size == 1) {
current->delayCount--;
if (current->delayCount == 0) {
delayQueue.head = null;
delayQueue.size = 0;
current->next = null;
current->prev = null;
current->state = T_READY;
YKExitMutex();
insertPriorityQueue(&readyQueue, current);
//printString("\nAfter insert\n");
return;
}
YKExitMutex();
return;
}
current->delayCount--;
while (current != null) {
current = delayQueue.head;
if (current->delayCount == 0) {
delayQueue.head = current->next;
if (current->next != null) {
current->next->prev = null;
}
current->next = null;
current->prev = null;
current->state = T_READY;
temp = current;
delayQueue.size--;
insertPriorityQueue(&readyQueue, temp);
current = delayQueue.head;
} else {
YKExitMutex();
return;
}
}
}
void insertDelayQueue(TCB* tcb) {
TCB* current;
unsigned int sumCount;
unsigned int oldSumCount;
if (tcb == null) return;
//Size = 0
YKEnterMutex();
if (delayQueue.size == 0) {
delayQueue.head = tcb;
tcb->next = null;
tcb->prev = null;
delayQueue.size++;
YKExitMutex();
return;
}
//Size > 0
current = delayQueue.head;
sumCount = 0;
oldSumCount = 0;
while (current != null) {
sumCount += current->delayCount;
if (tcb->delayCount < sumCount) {
tcb->next = current;
tcb->prev = current->prev;
if (current == delayQueue.head) {
delayQueue.head = tcb;
} else {
current->prev->next = tcb;
}
current->prev = tcb;
delayQueue.size++;
tcb->delayCount = tcb->delayCount - oldSumCount;
current->delayCount = current->delayCount - tcb->delayCount;
YKExitMutex();
return;
}
if (current->next == null) {
current->next = tcb;
tcb->prev = current;
tcb->next = null;
delayQueue.size++;
tcb->delayCount = tcb->delayCount - sumCount;
YKExitMutex();
return;
}
current = current->next;
oldSumCount = sumCount;
}
}
void printDelayQueue(void) {
TCB* current;
int i;
current = delayQueue.head;
printString("Printing Delay Queue with size ");
printInt(delayQueue.size);
printNewLine();
while (current != null) {
printInt(current->priority);
printString(" ");
printInt(current->delayCount);
printNewLine();
current = current->next;
}
}