// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "runtime.h" // Atomic add and return new value. #pragma textflag 7 uint32 runtime·xadd(uint32 volatile *val, int32 delta) { uint32 oval, nval; for(;;){ oval = *val; nval = oval + delta; if(runtime·cas(val, oval, nval)) return nval; } } #pragma textflag 7 uint32 runtime·xchg(uint32 volatile* addr, uint32 v) { uint32 old; for(;;) { old = *addr; if(runtime·cas(addr, old, v)) return old; } } #pragma textflag 7 void runtime·procyield(uint32 cnt) { uint32 volatile i; for(i = 0; i < cnt; i++) { } } #pragma textflag 7 uint32 runtime·atomicload(uint32 volatile* addr) { return runtime·xadd(addr, 0); } #pragma textflag 7 void* runtime·atomicloadp(void* volatile* addr) { return (void*)runtime·xadd((uint32 volatile*)addr, 0); } #pragma textflag 7 void runtime·atomicstorep(void* volatile* addr, void* v) { void *old; for(;;) { old = *addr; if(runtime·casp(addr, old, v)) return; } } #pragma textflag 7 void runtime·atomicstore(uint32 volatile* addr, uint32 v) { uint32 old; for(;;) { old = *addr; if(runtime·cas(addr, old, v)) return; } }