program p; unit sync : process(nr:integer); unit slock:procedure; begin accept sunlock; end slock; unit sunlock:procedure; begin end sunlock; begin return; do accept slock; od; end sync; unit main_process : process( i:integer, s:sync ); var cnt : integer; unit entry : procedure( i,j:integer ); begin writeln("entry called from node ",i," #",j); if j<0 then cnt:=cnt+1; fi; end entry; begin cnt := 0; return; while cnt < 2 do accept entry; od; call s.sunlock; end main_process; unit slave : process( i:integer, m:main_process ); var j:integer; begin return; for j:=1 to 10 do call m.entry( i, j ); od; call m.entry( i, -1 ); end slave; unit ender : process( i:integer ); begin return; call endrun; end ender; var m:main_process, s1,s2:slave, sem:sync, e:ender; begin sem := new sync( 0 ); resume( sem ); m := new main_process( 0, sem ); resume( m ); s1 := new slave( 2, m ); resume( s1 ); s2 := new slave( 3, m ); resume( s2 ); call sem.slock; e := new ender( 2 ); resume( e ); e := new ender( 3 ); resume( e ); writeln("end of program"); call endrun; end.