Peterson met shortcut
Pieter van Ede: 3019764
Wesley Kok: 3019853
Start programma
JavaDoc
Een programma wordt gestart en parsed zijn parameters. Als hier iets fout in gaat stopt hij en zal het gehele electieproces in de soep lopen.
Vervolgens worden er een queue en een semafoor gemaakt die gedeeld zullen worden tussen de aan te maken serverthread en het hoofdprogramma.
Er wordt dan een serverthread gemaakt die constant een accept doet en zodra hij een request krijgt,
maakt hij hier een kanaal voor en stopt dit in een gedeelde queue. Dan doet hij een vrij operatie op een gedeelde semafoor.
Zo weet het hoofdprogramma dat er een kanaal klaar staat die hij kan gebruiken.
Het opstarten van het programma gebeurt door GP2 aan te roepen met eerst het id van het programma, dan de poort waarop het programma zijn server mag
opzetten op de localhost en dan de poort van de rechterbuur op de localhost.
Denk er wel aan, om de boolean zelfdeVenster op de goede waarde te zetten voor de batchfile.
Windows batchfile (alle output in hetzelfde venster)
Windows batchfile (alle output in een venster per thread)
Linux batchfile
Electie
Opzetten van de ring
Het hoofdprogramma gaat dan verder. Hij kan nu een client request afvuren op de server van zijn buur en haalt vervolgens een
kanaal uit de queue. (dat is dus met de buur die een clientrequest op ons programma uitvoert). Voor het ophalen moet hij dus
eerst een pak operatie doen op de semafoor, om zeker te weten dat er een kanaal klaar staat.
Nu zijn de verbindingen gemaakt en kan de ronde begonnen worden.
De (eerste) ronde
Een programma stuurt zijn id door naar zijn buren en krijgt hun id terug.
Dan vergelijkt hij die en als hij het kleinste is gaat hij door naar de volgende ronde. Anders wordt hij passief.
Na deze ronde moet de nieuwe ring worden gemaakt.
Het overleven van een ronde
Als je doorgaat, stuur je je poort naar links door, zodat je nieuwe linker
buur connectie kan maken met jouw server, die nog steeds draait. Je krijgt zelf de poort van je nieuwe buur van je
rechterbuur die je net verslagen hebt.
Nu kan de nieuwe ring worden opgezet. Je vuurt dus een request af op je nieuwe buur, en je haalt een nieuwe client op uit je queue.
Dan begint de volgende ronde en begint de hele heisa opnieuw.
Passief worden
Als een ontvangen id kleiner is dan jouw id, overleef je de ronde niet en wordt je passief.
Een passief station krijgt een poortnummer die ze nog een keer moeten doorsturen, voor het opzetten van de nieuwe ring.
Daarna ga je wachten op het id van de leider. Je wacht dan op een nieuwe client van je server, om het id van de verkozen leider te
ontvangen; je zit nu dus in de slotfase.
Leider worden
Op een gegeven moment ben je nog als enige overgebleven. Je weet dat dit zo is, als de poort die je van rechts krijgt je eigen poort is.
Nu moet nog iedereen weten wie de leider is.
Hiervoor bewaren we de orginele poort, waarmee je verbinding maakt als je de originele ring gaat opbouwen.
De leider gaat, als client, verbinding zoeken met zijn originele rechterbuur.
Deze passieve buur zit in de slotfase en zal deze verbinding accepteren.
Nu stuurt de leider zijn id naar die buur. Nu zal elke volgende passieve buur op de originele ring het id van de leider doorsturen en daarna
termineren.
Alleen als de andere buur van de leider de leidersid heeft ontvangen maakt hij weer connectie met de leider.
Die wacht daarop, en krijgt zijn id weer terug als het goed is. Maar zoals men weet, willen verhalen wel eens hun eigen leven gaan
leiden als het mond op mond wordt doorverteld. Hij controleert daarom nog even of het ontvangen id nog steeds zijn id is.
In dat geval weet hij dat iedereen weet dat hij weet dat hij de leider is, en hij termineert.
Terminatie
Nu is het electie proces afgelopen. Elk programma kan termineren, maar heeft een server die mogelijk in een accept zit.
Hij stopt daarom zijn server, waardoor de accept zijn blokkade opheft, en de serverthread ook meteen uit zijn lus kan springen en netjes kan
eindigen. Alleen de accepts die het moesten opgeven, protesteren nog, maar die protesteren terecht tegen dovemansoren.