load ./q3.so source symul_lib.tcl # inicjalizuję wierzchołki set sasiedzi(0) {1 2 3} set sasiedzi(1) {0 4 5} set sasiedzi(2) {0 6} set sasiedzi(3) {0 7 8} set sasiedzi(4) {1} set sasiedzi(5) {1} set sasiedzi(6) {2} set sasiedzi(7) {3} set sasiedzi(8) {3} set liczbaWierz 9; # definiuję wierzchołki fiber create $liczbaWierz { #zmienne set safe 0; set korzen 0; set bezpieczneW 0; while {$run} { if {$korzen==0 && $stopien==1 && $safe==0} { set safe 1; dostarcz 0 "SAFE"; } #koniec wykonania fiber switchto main; while {$safe==0} { set licz 0; for {set i 0} {$i < $stopien} {incr i} { if {[lindex $kom($i) 0]=="SAFE"} { incr licz; } if {$licz == [expr $stopien - 1]} { set safe 1; for {set j 0} {$j < $stopien} {incr j} { czytaj $j; } } } fiber switchto main; } if {$korzen==0 && $safe==1 && $bezpieczneW==0 && $stopien>1} { dostarcz 0 "SAFE"; set bezpieczneW 1; } elseif {$korzen==1 && $safe==1} { for {set i 0} {$i < $stopien} {incr i} { dostarcz $i "PULSE"; set safe 0; } } fiber switchto main; if {[lindex $kom(0) 0]=="PULSE"} { if {$korzen==0 && $stopien>1} { czytaj 0; for {set j 1} {$j < $stopien} {incr j} { dostarcz $j "PULSE"; set bezpieczneW 0; set safe 0; } } else { czytaj 0; set bezpieczneW 0; set safe 0; } } fiber switchto main; } } InicjalizacjaAsynch proc wizualizacja {} { fiber_iterate {_puts "Wierzchołek $id, safe: $safe, korzen: $korzen"} } wizualizacja # ustawiamy korzeń po pierwszej egzekucji fiber_eval 0 {set korzen 1} fiber switchto 0; fiber switchto 1; fiber switchto 2; fiber switchto 3; fiber switchto 4; fiber switchto 5; fiber switchto 6; fiber switchto 7; fiber switchto 8;