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