// expect: 90000 // many actors increment one shared counter through a read, then a write; the hold block's lock makes every increment count namespace; include rt, actor; typecheck on; hold { shared let count = 0; fn inc() { let v = count; count = v + 1; return v; } fn total() { return count; } } int work(int n) { let i = 0; while (i < n) { inc(); i++; } return n; } fn main() { let i = 0; actor.Actor*[?] xs = rt.new(actor.Actor*[?]); while (i < 8) { actor.Actor* a = rt.new(actor.Actor); a.spawn(work); push(xs, a); i++; } i = 0; while (i < 8) { xs[i].send(10000); i++; } work(10000); i = 0; while (i < 8) { xs[i].recv(fn(int n) { return 0; }); xs[i].await(); i++; } rt.put_n(total()); rt.put_c(10); i = 0; while (i < 8) { xs[i].close(); i++; } return 0; }