v2 / vlib / v / tests / concurrency / shared_lock_2_test.v
52 lines · 49 sloc · 672 bytes · 6488041a749df9762348d019c4223908c476f2e2
Raw
1import time
2
3struct St {
4mut:
5 a int
6}
7
8fn (shared x St) f(shared y St, shared z St) {
9 for _ in 0 .. 101 {
10 lock x, y {
11 tmp := y.a
12 y.a = x.a
13 x.a = tmp
14 }
15 }
16 lock z {
17 z.a--
18 }
19}
20
21fn test_shared_receiver_lock() {
22 shared x := &St{
23 a: 5
24 }
25 shared y := &St{
26 a: 7
27 }
28 shared z := &St{
29 a: 1
30 }
31 spawn x.f(shared y, shared z)
32 for _ in 0 .. 100 {
33 lock x, y {
34 tmp := x.a
35 x.a = y.a
36 y.a = tmp
37 }
38 }
39 // the following would be a good application for a channel
40 for finished := false; true; {
41 rlock z {
42 finished = z.a == 0
43 }
44 if finished {
45 break
46 }
47 time.sleep(100 * time.millisecond)
48 }
49 rlock x, y {
50 assert x.a == 7 && y.a == 5
51 }
52}
53