## przyklad alg asynch
# + narzedzia do generowania egzekucji
# + czytajKomTypu typ nr_pol; # moze byc "*"
# komunikaty postaci {typ ...}
#
source symul_lib.tcl
set liczbaWierz 20
iterate i $liczbaWierz {
# petla "iterate i 10" iteruje od 0 do 9
let i1 $i-1; if {$i1==-1} {let i1 $liczbaWierz-1}
let i2 $i+1; if {$i2==$liczbaWierz} {let i2 0}
set sasiedzi($i) "$i1 $i2"
}
fiber create $liczbaWierz {
set lider {}
wyslij 1 "LE $id_los"
while {$run} {
set id0 [lindex [czytajKomTypu LE 0] 1]
if {$id0>$id_los} {
wyslij 1 "LE $id0"
} elseif {$id0==$id_los} {
set lider 1; wyslij 1 "LE -1"
} elseif {$id0==-1 && $lider=={}} {
set lider 0; wyslij 1 "LE -1"
}
}
}
InicjalizacjaAsynch
proc wizualizacja {} {
fiber_iterate {_puts "$id, $id_los, $lider; $kom0, $kom1"}
}
# ... do tego miejsca mozna wszystko wykonac
if 0 {
zakonczFibery; fiber delete
zakonczFibery; fiber restart
fiber error
zaproponuj
pokazKom
set licznikKom
}
fiber switchto 8; pokazKom
dostarczKom 9 0; pokazKom
# + tworzymy egzekucję recznie
iterate i 100 {fiber switchto [expr {int(rand()*$liczbaWierz)}]}
pokazKom
zaproponuj
_puts ---; pokazKom
exit