github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/lf/mcas/api_test.go (about) 1 package mcas 2 3 import ( 4 "testing" 5 "unsafe" 6 7 "gotest.tools/assert" 8 ) 9 10 func TestMCAS(t *testing.T) { 11 v1 := 1 12 v2 := 2 13 v3 := 3 14 v4 := 4 15 16 // try to compare and swap p1 and p2 atomically 17 18 // p1 and p2 initially points to v1 and v2 19 p1 := unsafe.Pointer(&v1) 20 p2 := unsafe.Pointer(&v2) 21 22 a := []*unsafe.Pointer{&p1, &p2} 23 e := []unsafe.Pointer{unsafe.Pointer(&v1), unsafe.Pointer(&v2)} 24 n := []unsafe.Pointer{unsafe.Pointer(&v3), unsafe.Pointer(&v4)} 25 26 swapped := CompareAndSwap(a, e, n) 27 assert.Assert(t, swapped) 28 29 // assert that p1 and p2 should be swapped to v3 and v4 30 p1v := Read(&p1) 31 p2v := Read(&p2) 32 assert.Assert(t, p1v == unsafe.Pointer(&v3) && p2v == unsafe.Pointer(&v4)) 33 assert.Assert(t, p1 == p1v && p2 == p2v) 34 35 swapped = CompareAndSwap(a, e, n) 36 assert.Assert(t, !swapped) 37 38 p1v = Read(&p1) 39 p2v = Read(&p2) 40 assert.Assert(t, p1v == unsafe.Pointer(&v3) && p2v == unsafe.Pointer(&v4)) 41 }