package buffalo.dataStructures; import java.util.Vector; /** Une <CODE>Tâche</CODE> est une entité effectuant des <CODE>Opérations</CODE> sur des <CODE>Buffers</CODE>, l'ordre de ces <CODE>Opérations</CODE>, les choix des <CODE>Buffers</CODE> sur lesquels les faire ainsi que les dimensions de ces derniers peuvent ou non occasionner des interblocages. Ceux-ci résultant soit d'une tentative de lecture dans un <CODE>Buffer</CODE> vide, soit d'une tentative d'écriture dans un <CODE>Buffer</CODE> plein. <BR> <BR> Une <CODE>Tâche</CODE> a plusieurs caractéristiques, à savoir : <UL> <LI> Une suite d'<CODE>Opérations</CODE>. </LI> <LI> Une série de <CODE>Buffers</CODE> connectés en écriture. </LI> <LI> Une série de <CODE>Buffers</CODE> connectés en lecture. </LI> </UL> */ public class Task { /* Tableau des instances de cette classe. */ private static Vector tasks; /* Tableau des opérations à effectuer par cette tâche */ private Vector operations; /* Tableau des buffers sur lesquels la tâche est susceptible de lire */ private Vector readBuffers; /* Tableau des buffers sue lesquels la tâche est susceptible d'écrire */ private Vector writeBuffers; /* L'index de l'instance courante de Task */ private int indexOfMe; /*-------------------------------------------------------*/ /* constructeur privé */ private Task() { if(tasks == null) { tasks = new Vector(); } indexOfMe = tasks.size(); operations = new Vector(); readBuffers = new Vector(); writeBuffers = new Vector(); } /*-------------------------------------------------------*/ /* Accesseurs de tous types!! */ /** Retourne la <CODE>indexOfTask</CODE>-ième <CODE>Tâche</CODE> instanciée. */ public static Task get(int indexOfTask) { return (Task)(tasks.get((int)indexOfTask)); } /*-------------------------------------------------------*/ /** Retourne le nombre de <CODE>Tâche</CODE> instanciées. */ public static int getNbTasks() { return tasks.size(); } /*-------------------------------------------------------*/ /** Crée une <CODE>Tâche</CODE> et la renvoie si sa création a été autorisée. */ static Task createTask() { Task newTask = new Task(); tasks.add(newTask); return newTask; } /*-------------------------------------------------------*/ /** Ajoute à la <CODE>Tâche</CODE> courante une <CODE>Opération</CODE> sur le <CODE>Buffer</CODE> d'indice <CODE>indexOfBuffer</CODE>. */ void addOperation(int indexOfBuffer) { operations.add(new Operation(indexOfBuffer, this.indexOfMe, operations.size())); } /*-------------------------------------------------------*/ /** Renvoie la <CODE>indexOfOperation</CODE>-ième <CODE>Opération</CODE> de la <CODE>Tâche</CODE> courante. */ public Operation getOperation(int indexOfOperation) { return (Operation)(operations.get((int)indexOfOperation)); } /*-------------------------------------------------------*/ /** Connecte les deux <CODE>Tâches</CODE> d'indices respectifs <CODE>indexOfWritingTask</CODE> et <CODE>indexOfReadingTask</CODE> avec le <CODE>Buffer</CODE> d'indice <CODE>indexOfBuffer</CODE>. */ static void connectWithBuffer(int indexOfWritingTask, int indexOfReadingTask, int indexOfBuffer) { ((Task)tasks.get((int)indexOfReadingTask)).addReadBuffer(indexOfBuffer); ((Task)tasks.get((int)indexOfWritingTask)).addWriteBuffer(indexOfBuffer); } /*-------------------------------------------------------*/ /** Ajoute le <CODE>Buffer</CODE> d'indice <CODE>indexOfBuffer</CODE> à la liste des buffers en lecture de la <CODE>Tâche</CODE> courante.<BR> Cette méthode se charge de mettre en place le chaînage double ou de vérifier si cela est déjà fait. */ private void addReadBuffer(int indexOfBuffer) { readBuffers.add(Buffer.get(indexOfBuffer)); } /*-------------------------------------------------------*/ /** Ajoute le <CODE>Buffer</CODE> d'indice <CODE>indexOfBuffer</CODE> à la liste des buffers en ecriture de la <CODE>Tâche</CODE> courante. <BR>Cette méthode se charge de mettre en place le chaînage double ou de vérifier si cela est déjà fait. */ private void addWriteBuffer(int indexOfBuffer) { writeBuffers.add(Buffer.get(indexOfBuffer)); } /*-------------------------------------------------------*/ /** Renvoie l'indice de l'instance courante de <CODE>Tâche</CODE>. */ public int getIndex() { return indexOfMe; } /*-------------------------------------------------------*/ /** Renvoie le <CODE>indexOfBuffer</CODE>-ième <CODE>Buffer</CODE> connecté en lecture sur la <CODE>Tâche</CODE> courante. */ public Buffer getReadBuffer(int indexOfBuffer) { return (Buffer)(readBuffers.get((int)indexOfBuffer)); } /*-------------------------------------------------------*/ /** Renvoie le nombre de <CODE>Buffers</CODE> connectés en lecture sur la <CODE>Tâche</CODE> courante. */ public int getNbReadBuffer() { return readBuffers.size(); } /*-------------------------------------------------------*/ /** Renvoie le <CODE>indexOfBuffer</CODE>-ième <CODE>Buffer</CODE> connecté en ecriture sur la <CODE>Tâche</CODE> courante. */ public Buffer getWriteBuffer(int indexOfBuffer) { return (Buffer)writeBuffers.get((int)indexOfBuffer); } /*-------------------------------------------------------*/ /** Renvoie le nombre de <CODE>Buffers</CODE> connectés en ecriture sur la <CODE>Tâche</CODE> courante. */ public int getNbWriteBuffer() { return writeBuffers.size(); } /*-------------------------------------------------------*/ /** Renvoie au format chaîne de caractères le script de crétion du jeu de <CODE>Tâches</CODE>, de <CODE>Buffers</CODE> et les <CODE>Opérations</CODE> associées. */ public static String allToString() { int nbTasks = getNbTasks(); String resultat = "#tasks " + nbTasks + "\n"; resultat += Buffer.allToString() ; resultat += "#operations"; for (int i = 0 ; i < nbTasks ; i++) { resultat += "\n" + get(i).toString() ; } return resultat; } /*-------------------------------------------------------*/ /** Renvoie au format chaîne de caractères le script de déclaration des <CODE>Opérations</CODE> effectuées par cette <CODE>Tâche</CODE>. */ public String toString() { String resultat = (new Integer(this.getIndex())).toString() + "( "; int nbOperations = getNbOperations(); if (nbOperations > 1) { resultat += this.getOperation(0).toString(); } else { resultat += ")"; return resultat; } for(int i = 1; i < nbOperations; i++) { resultat = resultat + ", " + this.getOperation(i).toString(); } resultat += " )"; return resultat; } /*-------------------------------------------------------*/ /** Renvoie le nombre d'<CODE>Opérations</CODE> programmées pour cette <CODE>Tâche</CODE>. */ public int getNbOperations() { return operations.size(); } }