63 lines
1.1 KiB
Tcl
63 lines
1.1 KiB
Tcl
|
|
# inicjalizacja
|
|
load ./q3.so
|
|
source symul_lib.tcl
|
|
|
|
# ustawienie ringu
|
|
set liczbaWierz 5
|
|
set sasiedzi(0) {4 1}
|
|
set sasiedzi(1) {0 2}
|
|
set sasiedzi(2) {1 3}
|
|
set sasiedzi(3) {2 4}
|
|
set sasiedzi(4) {3 0}
|
|
|
|
|
|
proc reverse li {
|
|
set len [llength $li]
|
|
iterate i $len {lappend wynik [lindex $li [expr {$len-$i-1}]]}
|
|
set wynik
|
|
}
|
|
|
|
|
|
fiber create $liczbaWierz {
|
|
set lider ?
|
|
wyslij 0 "$id_los 0 0"
|
|
wyslij 1 "$id_los 0 0"
|
|
fiber yield
|
|
while {$run} {
|
|
algorytm [czytaj 0] [czytaj 1]
|
|
fiber yield
|
|
}
|
|
}
|
|
|
|
Inicjalizacja;
|
|
|
|
proc wizualizacja {} {
|
|
_puts ---
|
|
fiber_iterate {_puts "id: $id, wartosc: $id_los, lider: $lider; $kom0, $kom1"}
|
|
}
|
|
|
|
fiber_iterate {
|
|
# + ta procedura jedynie przekazuje komunikaty...
|
|
proc algorytm {m0 m1} {
|
|
global id id_los stopien lider
|
|
if {$m0!=""} {
|
|
foreach {id0 i0 l0} $m0 break
|
|
incr i0
|
|
wyslij 1 "$id0 $i0 0";
|
|
}
|
|
if {$m1!=""} {
|
|
foreach {id1 i1 l1} $m1 break
|
|
incr i1
|
|
set i1 [expr {$i1+1}]
|
|
if {$m1==$id}{
|
|
set lider 1;
|
|
}
|
|
wyslij 0 "$id1 $i1 0"
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
fiber yield; runda; wizualizacja; set licznikKom
|