github.com/hslam/atomic@v1.0.0/pointer_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 "testing" 8 "unsafe" 9 ) 10 11 func TestPointer(t *testing.T) { 12 var v string 13 var vp = unsafe.Pointer(&v) 14 var addr = NewPointer(vp) 15 var v1 = "Hello World" 16 var vp1 = unsafe.Pointer(&v1) 17 addr.Store(vp1) 18 if addr.Load() != vp1 { 19 t.Log(addr.Load()) 20 } 21 var v2 = "Foo" 22 var vp2 = unsafe.Pointer(&v2) 23 old := addr.Swap(vp2) 24 if old != vp1 { 25 t.Log(addr.Load()) 26 } 27 var v3 = "Bar" 28 var vp3 = unsafe.Pointer(&v3) 29 if !addr.CompareAndSwap(vp2, vp3) { 30 t.Log(addr.Load()) 31 } 32 if addr.CompareAndSwap(vp2, vp3) { 33 t.Log(addr.Load()) 34 } 35 } 36 37 func BenchmarkSwapPointer(b *testing.B) { 38 var v string 39 var vp = unsafe.Pointer(&v) 40 var addr = NewPointer(vp) 41 var v1 = "Hello World" 42 var vp1 = unsafe.Pointer(&v1) 43 for i := 0; i < b.N; i++ { 44 addr.Swap(vp1) 45 } 46 } 47 48 func BenchmarkCompareAndSwapPointer(b *testing.B) { 49 var v string 50 var vp = unsafe.Pointer(&v) 51 var addr = NewPointer(vp) 52 var v1 = "Hello World" 53 var vp1 = unsafe.Pointer(&v1) 54 for i := 0; i < b.N; i++ { 55 addr.CompareAndSwap(vp, vp1) 56 } 57 } 58 59 func BenchmarkStorePointer(b *testing.B) { 60 var v string 61 var vp = unsafe.Pointer(&v) 62 var addr = NewPointer(vp) 63 var v1 = "Hello World" 64 var vp1 = unsafe.Pointer(&v1) 65 for i := 0; i < b.N; i++ { 66 addr.Store(vp1) 67 } 68 } 69 70 func BenchmarkLoadPointer(b *testing.B) { 71 var v string 72 var vp = unsafe.Pointer(&v) 73 var addr = NewPointer(vp) 74 for i := 0; i < b.N; i++ { 75 addr.Load() 76 } 77 }