v / vlib / sync
Raw file | 36 loc (31 sloc) | 595 bytes | Latest commit hash 730b2a926
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}