aboutsummaryrefslogtreecommitdiff
path: root/tests/hold/accept/race.zc
blob: f7fdb6160b6ebe427661a20b71629167cd33a264 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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<int,int>*[?] xs = rt.new(actor.Actor<int,int>*[?]);
    while (i < 8) { actor.Actor<int,int>* a = rt.new(actor.Actor<int,int>); 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;
}