scheduler : readyQueue.c\h - owanesh/unifi-eos GitHub Wiki

Rappresenta una lista doppiamente concatenata di task.

readyQueue.h

typedef struct ReadyQueue {
	Task task;
	struct ReadyQueue *next;
	struct ReadyQueue *previous;
} ReadyQueue;

Una lista doppiamente concatenata consente più agilmente di accedere ai nodi successivo e precedente, come in operazioni di swap ecc.

readyQueue.c

/*
 * Restituisce un puntatore al Task identificato da 'id, altrimenti NULL.
 */
ReadyQueue* searchById(ReadyQueue *head, unsigned long id) {
	ReadyQueue* p = head;
	ReadyQueue* rst = NULL;
	int found = 0;
	while (!found && p != NULL) {
		if (p->task.id == id) {
			rst = p;
			found = 1;
		}
		p = p->next;
	}
	return rst;
}
/*
 * Restituisce 1 se la lista è vuota, altrimenti 0
 */
int isEmpty(ReadyQueue *head) {
	if (head == NULL)
		return 1;
	else
		return 0;
}

Si ipotizza di passare sempre il puntatore alla testa della lista.

/*
 * Restituisce il puntatore all'ultimo nodo della lista se non vuota, altrimenti NULL
 */
ReadyQueue* getLastNode(ReadyQueue *head) {
	if (isEmpty(head)) {
		return NULL;
	}
	ReadyQueue *last = head;
	while (last->next != NULL) {
		last = last->next;
	}
	return last;
}

La dichiarazione della struttura readyQueue e la definizione delle funzioni utili ad interagire con essa sono presenti nel file readyQueue.h, l’implementazione di tali operazioni sono presenti in readyQueue.c (oltre alla funzione printList() qui non riportata perché comprendente solo di printf() opportunamente formattate).