// Example of livelock due to endless iteration. // (List Iterator is not guaranteed to reach list end.) interface Iterator { extern element $int$; enum end {yes, no}; in end next(element elmt); behaviour { end done = end.no; on next: [done.no] {reply(done); done = end.yes;} on next: {reply(done);} } } interface IList { in void step(); behaviour { on step:{} } } component List { provides IList pp; requires Iterator list; behaviour { Iterator.end head() { Iterator.element elmt; Iterator.end it = list.next(elmt); return it; } void tail(Iterator.end done) { if (done == Iterator.end.no) { Iterator.element elmt; done = list.next(elmt); tail(done); } } on pp.step(): { Iterator.end it = head(); tail(it); } } }