1、用级的概念代替轮的概念,仅当地2个令牌具有相同的级时,它们将引起新的遍历。新产生的令牌高出一级。如果令牌遇到高一级的令牌,或到达已被高一级令牌访问的节点,到达的令牌则简单地被杀死,而不影响更高一级的令牌。
2、每个令牌牌三种模式之一:合并(annex)、追赶(chase)、等待(wait)。
3、用(q,l)表示令牌,其中q表示令牌的初始进程,l表示它的级别。
4、lastp用于处于追赶模式的令牌,trav函数为遍历算法作用函数,返回令牌必须被转发到的近邻。
5、
var levp :integer init -1;
catp,waitp:P init udef;
lastp:Neighp init udef;
begin if p is initiator then
begin levp:=levp+1;lastp:=trav(p,levp);
catp:=p;send <annex,p,levp> to lastp
end;
while .....(*终止条件*) do
begin receive token (q,l);
if token is annexing then t:=A else t:=C;
if l>levp then (*Case I*)
begin levp:=l;catp:=q;
waitp:=udef;lastp:=trav(q,l);
send <annex,q,l> to lastp
end
else if l=levp and waitp≠pudef then (*Case II*)
begin waitp:=udef;levp:=levp+1 ;lastp:=trav(p,levp);catp:=p;
send <annex,p,levp> to lastp
end
else if l=levp and lastp=udef then(*Case III*)
waitp:=q
else if l=levp and t=A and q=catp then (*Case IV*)
begin lastp:=trav(q,l);
if lastp=decide
then p annouces itself leader
else send <annex,q,l> to lastp
end
else if l=levp and ((t=A and q>catp)or t=C) then (*Case V*)
begin send <chase,q,l> to lastp;lastp:=udef end
else if l=levp then (*Case VI*)
waitp:=q
end
end