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();
}
}