Skip to content
This repository was archived by the owner on Nov 4, 2023. It is now read-only.

scheduler : execute.c

sᴀʟᴠᴀᴛᴏʀᴇ ʙ edited this page Jul 17, 2017 · 1 revision
void execute(ReadyQueue **head) {
	if (isEmpty(*head)) {
		printf("La lista dei task e' vuota.");
		return;
	}
	ReadyQueue *last = getLastNode(*head);
	last->task.exec_cycles--; //decremento delle esecuzioni di un'unità
	printf("Esecuzione avvenuta con successo.\n");
	checkTermination(head, last);
}

Essendo la lista sempre ordinata affinché il prossimo task da eseguire sia quello in fondo, si ottiene l’indirizzo all’ultimo task e se ne decrementano i cicli di esecuzione.

Il controllo di terminazione è delegato a checkTermination(). Il doppio puntatore è necessario perché la terminazione può prevedere un cambio di head.

void executeById(ReadyQueue **head, unsigned long id) {
	if (isEmpty(*head)) {
		printf("La lista dei task e' vuota.");
		return;
	}
	ReadyQueue *found = searchById(*head, id);
	if (found == NULL) {
		printf("Task non trovato nel sistema");
		return;
	}
	found->task.exec_cycles--; //decremento delle esecuzioni di un'unità
	printf("Esecuzione avvenuta con successo.\n");
	checkTermination(head, found);
}
/*
 * Verifica se task è terminato, in caso affermativo ne avvia l'eliminazione dalla lista
 */
void checkTermination(ReadyQueue** head, ReadyQueue* task) {
	if (task->task.exec_cycles == 0) {
		char name[9];
		strcpy(name, task->task.name);
		delete(head, task); //cancellazione delegata al modulo delete
		printf("Il task %s ha terminato la sua esecuzione.", name);
	}
}

Clone this wiki locally