v2 / vlib / v / tests / concurrency / shared_lock_5_test.v
68 lines · 64 sloc · 921 bytes · 6488041a749df9762348d019c4223908c476f2e2
Raw
1struct St {
2mut:
3 a int
4}
5
6fn (shared x St) f(shared y St, shared z St) {
7 for _ in 0 .. 10000 {
8 lock x, y, z {
9 tmp := z.a
10 z.a = y.a
11 y.a = x.a
12 x.a = tmp
13 }
14 }
15}
16
17fn (shared x St) g(shared y St, shared z St) {
18 for _ in 0 .. 10000 {
19 lock z, x, y {
20 tmp := x.a
21 x.a = z.a
22 z.a = y.a
23 y.a = tmp
24 }
25 }
26}
27
28fn h(shared x St, shared y St, shared z St) {
29 for _ in 0 .. 10000 {
30 lock y, x, z {
31 tmp := y.a
32 y.a = z.a
33 z.a = x.a
34 x.a = tmp
35 }
36 }
37}
38
39fn test_shared_receiver_lock() {
40 shared x := &St{
41 a: 5
42 }
43 shared y := &St{
44 a: 7
45 }
46 shared z := &St{
47 a: 1
48 }
49 t1 := spawn x.f(shared y, shared z)
50 t2 := spawn x.f(shared y, shared z)
51 t3 := spawn h(shared x, shared y, shared z)
52 for _ in 0 .. 10000 {
53 lock z, y, x {
54 tmp := y.a
55 y.a = x.a
56 x.a = z.a
57 z.a = tmp
58 }
59 }
60 t1.wait()
61 t2.wait()
62 t3.wait()
63 rlock x, y, z {
64 assert x.a == 7
65 assert y.a == 1
66 assert z.a == 5
67 }
68}
69