diff options
| author | Michael Stapelberg <stapelberg@debian.org> | 2013-03-04 21:27:43 +0100 |
|---|---|---|
| committer | Michael Stapelberg <michael@stapelberg.de> | 2013-03-04 21:27:43 +0100 |
| commit | ad47422646a18ffcb47cec916ef7393c923f2e76 (patch) | |
| tree | 7c7861fb3d9539d61c1dcfd5b8dadee974c25760 /src/pkg/runtime/atomic_arm.c | |
| parent | 2c8d5d584a79781ca41bb6f4b396893fbbac5b97 (diff) | |
| parent | 04b08da9af0c450d645ab7389d1467308cfc2db8 (diff) | |
| download | golang-ad47422646a18ffcb47cec916ef7393c923f2e76.tar.gz | |
Merge tag 'upstream/1.1_hg20130304' into debian-sid
Upstream version 1.1~hg20130304
Diffstat (limited to 'src/pkg/runtime/atomic_arm.c')
| -rw-r--r-- | src/pkg/runtime/atomic_arm.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/pkg/runtime/atomic_arm.c b/src/pkg/runtime/atomic_arm.c index 52e4059ae..0b54840cc 100644 --- a/src/pkg/runtime/atomic_arm.c +++ b/src/pkg/runtime/atomic_arm.c @@ -3,6 +3,14 @@ // license that can be found in the LICENSE file. #include "runtime.h" +#include "arch_GOARCH.h" + +static union { + Lock l; + byte pad [CacheLineSize]; +} locktab[57]; + +#define LOCK(addr) (&locktab[((uintptr)(addr)>>3)%nelem(locktab)].l) // Atomic add and return new value. #pragma textflag 7 @@ -80,4 +88,56 @@ runtime·atomicstore(uint32 volatile* addr, uint32 v) if(runtime·cas(addr, old, v)) return; } -}
\ No newline at end of file +} + +#pragma textflag 7 +bool +runtime·cas64(uint64 volatile *addr, uint64 *old, uint64 new) +{ + bool res; + + runtime·lock(LOCK(addr)); + if(*addr == *old) { + *addr = new; + res = true; + } else { + *old = *addr; + res = false; + } + runtime·unlock(LOCK(addr)); + return res; +} + +#pragma textflag 7 +uint64 +runtime·xadd64(uint64 volatile *addr, int64 delta) +{ + uint64 res; + + runtime·lock(LOCK(addr)); + res = *addr + delta; + *addr = res; + runtime·unlock(LOCK(addr)); + return res; +} + +#pragma textflag 7 +uint64 +runtime·atomicload64(uint64 volatile *addr) +{ + uint64 res; + + runtime·lock(LOCK(addr)); + res = *addr; + runtime·unlock(LOCK(addr)); + return res; +} + +#pragma textflag 7 +void +runtime·atomicstore64(uint64 volatile *addr, uint64 v) +{ + runtime·lock(LOCK(addr)); + *addr = v; + runtime·unlock(LOCK(addr)); +} |
