namespace; include rt, actor; typecheck on; // one counter for every actor. only the functions written in the block can touch it, // and each call holds the block's lock, so a read and the write after it can't interleave. hold { shared let hits = 0; fn hit() { let seen = hits; hits = seen + 1; return seen; } fn total() { return hits; } } int work(int n) { let i = 0; while (i < n) { hit(); i++; } return n; } fn main() { actor.Actor* a = rt.new(actor.Actor), b = rt.new(actor.Actor); a.spawn(work); b.spawn(work); a.send(1000); b.send(1000); a.recv(fn(int n) { return 0; }); b.recv(fn(int n) { return 0; }); a.await(); b.await(); rt.put_n(total()); rt.put_c(10); a.close(); b.close(); return 0; }