105 lines
2.2 KiB
Tcl
105 lines
2.2 KiB
Tcl
|
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;
|