v2 / vlib / v / tests / concurrency / shared_map_test.v
171 lines · 164 sloc · 2.61 KB · 6488041a749df9762348d019c4223908c476f2e2
Raw
1import sync
2
3fn incr(shared foo map[string]int, key string, mut sem sync.Semaphore) {
4 for _ in 0 .. 100000 {
5 lock foo {
6 foo[key] = foo[key] + 1
7 }
8 }
9 sem.post()
10}
11
12fn test_shared_array() {
13 shared foo := {
14 'p': 10
15 'q': 0
16 }
17 lock foo {
18 foo['q'] = 20
19 }
20 mut sem := sync.new_semaphore()
21 spawn incr(shared foo, 'p', mut sem)
22 spawn incr(shared foo, 'q', mut sem)
23 spawn incr(shared foo, 'p', mut sem)
24 spawn incr(shared foo, 'q', mut sem)
25 for _ in 0 .. 50000 {
26 lock foo {
27 foo['p'] -= 2
28 foo['q'] += 3
29 }
30 }
31 for _ in 0 .. 4 {
32 sem.wait()
33 }
34 rlock foo {
35 fp := foo['p']
36 fq := foo['q']
37 assert fp == 100010
38 assert fq == 350020
39 }
40}
41
42fn test_shared_init_syntax() {
43 shared foo := &{
44 'p': 17
45 'q': -3
46 'qwertz': 10
47 }
48 shared bar := {
49 'wer': 13.75
50 'cvbn': -7.25
51 'asd': -0.0625
52 }
53 shared baz := &map[string]int{}
54 shared qux := map[string]f64{}
55 shared quux := new_map()
56 lock foo {
57 foo['q'] = 20
58 }
59 lock bar {
60 bar['asd'] = 12.5
61 }
62 lock baz, qux, quux {
63 baz['wer'] = 12
64 qux['abc'] = -17.0625
65 quux['tzu'] = 1.125
66 }
67 rlock foo, bar, baz, qux, quux {
68 assert foo['q'] == 20
69 assert bar['asd'] == 12.5
70 assert baz['wer'] == 12
71 assert qux['abc'] == -17.0625
72 assert quux['tzu'] == 1.125
73 assert quux['yxc'] == 9.125
74 }
75}
76
77fn new_map() map[string]f64 {
78 m := {
79 'qwe': 34.25
80 'yxc': 9.125
81 'tzu': -7.5
82 }
83 return m
84}
85
86fn test_shared_array_iteration() {
87 shared a := [12.75, -0.125, 18.5 - (1.0 + .5)]
88 mut n0 := 0
89 mut n1 := 0
90 mut n2 := 0
91 rlock a {
92 for i, val in a {
93 match i {
94 1 {
95 assert val == -0.125
96 n1++
97 // check for order, too:
98 assert n0 == 1
99 }
100 0 {
101 assert val == 12.75
102 n0++
103 }
104 2 {
105 assert val == 17.0
106 n2++
107 assert n1 == 1
108 }
109 else {
110 // this should not happen
111 assert false
112 }
113 }
114 }
115 }
116 // make sure we have iterated over each of the 3 keys exactly once
117 assert n0 == 1
118 assert n1 == 1
119 assert n2 == 1
120}
121
122fn test_shared_map_iteration() {
123 shared m := {
124 'qwe': 12.75
125 'rtz': -0.125
126 'k': 17
127 }
128 mut n0 := 0
129 mut n1 := 0
130 mut n2 := 0
131 rlock m {
132 for k, val in m {
133 match k {
134 'rtz' {
135 assert val == -0.125
136 n0++
137 }
138 'qwe' {
139 assert val == 12.75
140 n1++
141 }
142 'k' {
143 assert val == 17.0
144 n2++
145 }
146 else {
147 // this should not happen
148 assert false
149 }
150 }
151 }
152 }
153 // make sure we have iterated over each of the 3 keys exactly once
154 assert n0 == 1
155 assert n1 == 1
156 assert n2 == 1
157}
158
159fn test_shared_map_in() {
160 shared m := {
161 'qwe': 12.75
162 'rtz': -0.125
163 'k': 17
164 }
165 rlock m {
166 assert 'qwe' in m
167 assert 'rtz' in m
168 assert 'k' in m
169 assert 'zxc' !in m
170 }
171}
172