MCPcopy Create free account
hub / github.com/TheThingsNetwork/lorawan-stack / TestAtomicConditionals

Function TestAtomicConditionals

pkg/workerpool/workerpool_test.go:33–96  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

31)
32
33func TestAtomicConditionals(t *testing.T) {
34 var release sync.WaitGroup
35 release.Add(1)
36
37 var wg sync.WaitGroup
38
39 var increaseFailures sync.Map
40 var decreaseFailures sync.Map
41
42 value := int32(5_000)
43 lowerBound := int32(100)
44 upperBound := int32(10_000)
45 for k := range 100_000 {
46
47 wg.Add(1)
48 go func() {
49 release.Wait()
50 defer wg.Done()
51 if workerpool.IncrementIfSmallerThan(&value, upperBound) {
52 if v := atomic.LoadInt32(&value); v > upperBound {
53 increaseFailures.Store(k, v)
54 }
55 }
56 }()
57
58 wg.Add(1)
59 go func() {
60 release.Wait()
61 defer wg.Done()
62 if workerpool.DecrementIfGreaterThan(&value, lowerBound) {
63 if v := atomic.LoadInt32(&value); v < lowerBound {
64 decreaseFailures.Store(k, v)
65 }
66 }
67 }()
68
69 wg.Add(1)
70 go func() {
71 release.Wait()
72 defer wg.Done()
73 if v := atomic.LoadInt32(&value); v > upperBound {
74 increaseFailures.Store(k, v)
75 }
76 if v := atomic.LoadInt32(&value); v < lowerBound {
77 decreaseFailures.Store(k, v)
78 }
79 }()
80 }
81
82 release.Done()
83 wg.Wait()
84
85 increaseFailures.Range(func(ki any, vi any) bool {
86 k, v := ki.(int), vi.(int32)
87 t.Errorf("Value %v exceeded upper bound %v in test %v", v, upperBound, k)
88 return true
89 })
90

Callers

nothing calls this directly

Calls 5

DoneMethod · 0.80
AddMethod · 0.65
WaitMethod · 0.65
RangeMethod · 0.65
ErrorfMethod · 0.65

Tested by

no test coverage detected