v / vlib / sync / many_times.v
36 lines · 31 sloc · 594 bytes · da3112e5453b553ca230d47590e0d3ed6be6478d
Raw
1module sync
2
3import sync.stdatomic
4
5pub struct ManyTimes {
6mut:
7 m RwMutex
8pub:
9 times u64 = 1
10 count u64
11}
12
13// new_many_times return a new ManyTimes struct.
14pub fn new_many_times(times u64) &ManyTimes {
15 mut many_times := &ManyTimes{
16 times: times
17 }
18 many_times.m.init()
19 return many_times
20}
21
22// do execute the function only setting times.
23pub fn (mut m ManyTimes) do(f fn ()) {
24 if stdatomic.load_u64(&m.count) < m.times {
25 m.do_slow(f)
26 }
27}
28
29fn (mut m ManyTimes) do_slow(f fn ()) {
30 m.m.lock()
31 if m.count < m.times {
32 stdatomic.store_u64(&m.count, m.count + 1)
33 f()
34 }
35 m.m.unlock()
36}
37