// Mettre en attente un processus s'il doit attendre à la barrière private void attenteSiBarriere(Processus processus) { foreach (Barriere barriere in lstBarrieres) { if (barriere.getBarrierePassee() == false) { foreach (KeyValuePair <int, int> kvp in barriere.getBarriere()) { if (processus.getPID() == kvp.Key) { if (processus.getNbInstructionsExecutees() == kvp.Value) { processus.mettreEnAttenteBarriere(); processus.setEtat(Enums.etatProcessus.Pret); foreach (Thread thread in processus.getThreads()) { thread.setEtat(Enums.etatThread.Pret); updateInfoThread(processus); } } } } } } }
// Trouver l'instruction du processus de la barrière précédante (pour éviter les interblocages) private int trouverInstructionPrecedante(Processus processus) { int instructionPrec = 1; foreach (KeyValuePair <int, int> kvp in lstBarrieres[lstBarrieres.Count - 1].barriere) { if (kvp.Key == processus.getPID()) { instructionPrec = kvp.Value; } } return(instructionPrec); }
// Supprimer une barrière si elle contenait le processus supprimé private void supBarriere(Processus processus) { bool processusSupprime = false; foreach (Barriere barriere in lstBarrieres) { foreach (KeyValuePair <int, int> kvp in barriere.getBarriere()) { if (processus.getPID() == kvp.Key) { lstBarrieres.Remove(lstBarrieres.Find(cetteBarriere => cetteBarriere.getID() == barriere.getID())); processusSupprime = true; break; } } if (processusSupprime == true) { break; } } }