81 lines
1.7 KiB
Tcl
81 lines
1.7 KiB
Tcl
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; |