github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/lf/mcas/api.go (about)

     1  package mcas
     2  
     3  import "unsafe"
     4  
     5  // CompareAndSwap for multiple pointer type variables
     6  func CompareAndSwap(a []*unsafe.Pointer, e []unsafe.Pointer, n []unsafe.Pointer) (swapped bool) {
     7  	d := are.putMCDesc()
     8  	*d = mcDesc{a: a, e: e, n: n, s: undecided}
     9  	/* Memory locations must be sorted into address order. */
    10  	d.sortAddr()
    11  	swapped = d.mcasHelp()
    12  	return
    13  }
    14  
    15  // Read for a mcas consistent view
    16  func Read(a *unsafe.Pointer) (v unsafe.Pointer) {
    17  
    18  	for v = ccasRead(a); isMCDesc(v); ccasRead(a) {
    19  		mcfromPointer(v).mcasHelp()
    20  	}
    21  
    22  	return
    23  }