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 }