81 lines
1.9 KiB
Tcl
81 lines
1.9 KiB
Tcl
|
load ./q3.so
|
||
|
source symul_lib.tcl
|
||
|
|
||
|
|
||
|
# inicjalizacja wierzchołków
|
||
|
set liczbaWierz 20
|
||
|
iterate i $liczbaWierz {
|
||
|
let ipierwsze $i-1;
|
||
|
if {$ipierwsze==-1} {let ipierwsze $liczbaWierz-1}
|
||
|
|
||
|
let idrugie $i+1;
|
||
|
if {$idrugie==$liczbaWierz} {let idrugie 0}
|
||
|
|
||
|
set sasiedzi($i) "$ipierwsze $idrugie"
|
||
|
}
|
||
|
|
||
|
|
||
|
# definiuję wierzchołki
|
||
|
fiber create $liczbaWierz {
|
||
|
while {$run} {
|
||
|
set bezpieczny 0;
|
||
|
|
||
|
# do wszystkich sąsiadów wysyłam ID
|
||
|
for {set i 0} {$i < $stopien} {incr i} {
|
||
|
dostarcz $i $id;
|
||
|
}
|
||
|
|
||
|
# koniec wykonania
|
||
|
fiber switchto main;
|
||
|
|
||
|
# potwierdzenie otrzymania komunikatu
|
||
|
for {set i 0} {$i < $stopien} {incr i} {
|
||
|
czytaj $i;
|
||
|
}
|
||
|
|
||
|
# jeśli odebrałem komunikat to wysyłam safe
|
||
|
for {set j 0} {$j < $stopien} {incr j} {
|
||
|
dostarcz $j "SAFE";
|
||
|
}
|
||
|
|
||
|
#koniec wykonania
|
||
|
fiber switchto main;
|
||
|
|
||
|
while {$bezpieczny == 0} {
|
||
|
set licz 0;
|
||
|
|
||
|
for {set i 0} {$i < $stopien} {incr i} {
|
||
|
|
||
|
# zwiększam licz jeśli pierwszy to safe
|
||
|
if {[lindex $kom($i) 0]=="SAFE"} {
|
||
|
incr licz;
|
||
|
}
|
||
|
|
||
|
# otrzymałem safe od każdego sąsiada
|
||
|
if {$licz == $stopien} {
|
||
|
set bezpieczny 1;
|
||
|
|
||
|
# usuwam safe z listy
|
||
|
for {set j 0} {$j < $stopien} {incr j} {
|
||
|
czytaj $j;
|
||
|
}
|
||
|
} else {
|
||
|
set bezpieczny 0;
|
||
|
}
|
||
|
}
|
||
|
fiber switchto main;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
InicjalizacjaAsynch
|
||
|
|
||
|
# pokaż komunikaty
|
||
|
fiber switchto 0; pokazKom
|
||
|
fiber switchto 1; pokazKom
|
||
|
fiber switchto 2; pokazKom
|
||
|
fiber switchto 3; pokazKom
|
||
|
fiber switchto 4; pokazKom
|
||
|
fiber switchto 5; pokazKom
|
||
|
fiber switchto 6; pokazKom
|
||
|
fiber switchto 7; pokazKom
|