github.com/hslam/atomic@v1.0.0/uintptr_test.go (about) 1 // Copyright (c) 2020 Meng Huang (mhboy@outlook.com) 2 // This package is licensed under a MIT license that can be found in the LICENSE file. 3 4 package atomic 5 6 import ( 7 "sync" 8 "testing" 9 ) 10 11 func TestUintptr(t *testing.T) { 12 addr := NewUintptr(1) 13 if addr.Load() != 1 { 14 t.Error(addr.Load()) 15 } 16 addr.Store(2) 17 if addr.Load() != 2 { 18 t.Error(addr.Load()) 19 } 20 var delta = uintptr(2) 21 if addr.Add(delta) != 4 { 22 t.Error(addr.Load()) 23 } 24 if addr.Load() != 4 { 25 t.Error(addr.Load()) 26 } 27 var new = uintptr(5) 28 if addr.Swap(new) != 4 { 29 t.Error(addr.Load()) 30 } 31 var old = new 32 new = 6 33 if !addr.CompareAndSwap(old, new) { 34 t.Error(addr.Load()) 35 } 36 if addr.CompareAndSwap(old, new) { 37 t.Error(addr.Load()) 38 } 39 } 40 41 func TestAddUintptr(t *testing.T) { 42 addr := NewUintptr(1) 43 var wg sync.WaitGroup 44 for i := 0; i < 8192; i++ { 45 wg.Add(1) 46 go func() { 47 defer wg.Done() 48 addr.Add(1) 49 }() 50 } 51 wg.Wait() 52 } 53 54 func TestCompareAndSwapUintptr(t *testing.T) { 55 addr := NewUintptr(1) 56 var wg sync.WaitGroup 57 for i := 0; i < 8192; i++ { 58 wg.Add(1) 59 go func() { 60 defer wg.Done() 61 addr.CompareAndSwap(1, 2) 62 }() 63 } 64 wg.Wait() 65 } 66 67 func TestSwapUintptr(t *testing.T) { 68 addr := NewUintptr(1) 69 var wg sync.WaitGroup 70 for i := 0; i < 8192; i++ { 71 wg.Add(1) 72 go func() { 73 defer wg.Done() 74 addr.Swap(1) 75 }() 76 } 77 wg.Wait() 78 } 79 80 func BenchmarkSwapUintptr(b *testing.B) { 81 addr := NewUintptr(1) 82 for i := 0; i < b.N; i++ { 83 addr.Swap(1) 84 } 85 } 86 87 func BenchmarkCompareAndSwapUintptr(b *testing.B) { 88 addr := NewUintptr(1) 89 for i := 0; i < b.N; i++ { 90 addr.CompareAndSwap(1, 2) 91 } 92 } 93 94 func BenchmarkAddUintptr(b *testing.B) { 95 addr := NewUintptr(1) 96 for i := 0; i < b.N; i++ { 97 addr.Add(1) 98 } 99 } 100 101 func BenchmarkStoreUintptr(b *testing.B) { 102 addr := NewUintptr(1) 103 for i := 0; i < b.N; i++ { 104 addr.Store(1) 105 } 106 } 107 108 func BenchmarkLoadUintptr(b *testing.B) { 109 addr := NewUintptr(1) 110 for i := 0; i < b.N; i++ { 111 addr.Load() 112 } 113 }