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  }