diff options
| author | 2026-10-15 14:36:10 +0330 | |
|---|---|---|
| committer | 2026-10-15 14:36:10 +0330 | |
| commit | 24a21f7520ce91681e573833b7f33156e308964a (patch) | |
| tree | 9b2684173ee515649f4209192d9ed7f4acda6754 /examples | |
| parent | lsp: hold and shared hovers, completion of the keywords, shared variables mar... (diff) | |
docs: hold blocks in LEARN.md (36-hold), spec 5.16, ACTOR.md; TODO: m:n scheduler and follow-ups
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/learn/36-hold.out | 1 | ||||
| -rw-r--r-- | examples/learn/36-hold.zc | 24 |
2 files changed, 25 insertions, 0 deletions
diff --git a/examples/learn/36-hold.out b/examples/learn/36-hold.out new file mode 100644 index 0000000..8bd1af1 --- /dev/null +++ b/examples/learn/36-hold.out @@ -0,0 +1 @@ +2000 diff --git a/examples/learn/36-hold.zc b/examples/learn/36-hold.zc new file mode 100644 index 0000000..6052129 --- /dev/null +++ b/examples/learn/36-hold.zc @@ -0,0 +1,24 @@ +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<int,int>* a = rt.new(actor.Actor<int,int>), b = rt.new(actor.Actor<int,int>); + 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; +} |
