load ./q3.so source symul_lib.tcl # tworzę wierzchołki set liczbaWierz 5 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 { # te zmienne są wymagane do wizualizacji set lider {}; set minimalneId {}; fiber yield; # Cykl zorientowany - wysyłam połączeniem 0, odbieram połączeniem 1 dostarcz 0 "LE $id"; while {$run} { set msg [lindex [czytaj 1] 1]; if {$msg!=""} { if {$msg<$id} { dostarcz 0 "LE $msg"; set minimalneId $msg; } elseif {$msg==$id} { set lider 1; set minimalneId $msg; dostarcz 0 "LE false"; } elseif {$msg=="false" && $lider=={}} { set lider 0; dostarcz 0 "LE false"; } } #koniec wykonywania procedury danego wierzchołka fiber switchto main; } } InicjalizacjaAsynch #procedura wizualizacji proc wizualizacja {} { fiber_iterate {_puts "id: $id, lider: $lider, minimalneId: $minimalneId, kom0: $kom0, kom1: $kom1"} } #licznik set licz 0; proc egzekucja {liczbaWierz licz args} { #losowanie set random [expr {int(rand()*[expr $liczbaWierz+1])}]; for {set i 0} {$i < $liczbaWierz} {incr i} { if {$i!=$random && $licz!=0} { _puts "Działa wierzchołek: $i" fiber switchto $i; } elseif {$licz==0} { _puts "Działa wierzchołek: $i" fiber switchto $i; } } set licz [expr $licz + 1]; } #wykonanie egzekucja $liczbaWierz $licz; set licz 1; wizualizacja;