Module Name: src Committed By: matt Date: Mon Jan 27 18:29:47 UTC 2014
Modified Files: src/common/lib/libc/atomic: atomic_add_32_cas.c atomic_add_64_cas.c atomic_and_32_cas.c atomic_and_64_cas.c atomic_or_32_cas.c atomic_or_64_cas.c Log Message: Rework so that __sync_fetch_and_<OP>_<N> actually returns a value. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/common/lib/libc/atomic/atomic_add_32_cas.c \ src/common/lib/libc/atomic/atomic_and_32_cas.c \ src/common/lib/libc/atomic/atomic_or_32_cas.c cvs rdiff -u -r1.6 -r1.7 src/common/lib/libc/atomic/atomic_add_64_cas.c \ src/common/lib/libc/atomic/atomic_and_64_cas.c \ src/common/lib/libc/atomic/atomic_or_64_cas.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/common/lib/libc/atomic/atomic_add_32_cas.c diff -u src/common/lib/libc/atomic/atomic_add_32_cas.c:1.5 src/common/lib/libc/atomic/atomic_add_32_cas.c:1.6 --- src/common/lib/libc/atomic/atomic_add_32_cas.c:1.5 Mon Jan 27 18:08:37 2014 +++ src/common/lib/libc/atomic/atomic_add_32_cas.c Mon Jan 27 18:29:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_add_32_cas.c,v 1.5 2014/01/27 18:08:37 matt Exp $ */ +/* $NetBSD: atomic_add_32_cas.c,v 1.6 2014/01/27 18:29:47 matt Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -33,8 +33,10 @@ #include <sys/atomic.h> -void -atomic_add_32(volatile uint32_t *addr, int32_t val) +uint32_t __sync_fetch_and_add_4(volatile uint32_t *, int32_t); + +uint32_t +__sync_fetch_and_add_4(volatile uint32_t *addr, int32_t val) { uint32_t old, new; @@ -42,6 +44,13 @@ atomic_add_32(volatile uint32_t *addr, i old = *addr; new = old + val; } while (atomic_cas_32(addr, old, new) != old); + return old; +} + +void +atomic_add_32(volatile uint32_t *addr, int32_t val) +{ + (void) __sync_fetch_and_add_4(addr, val); } #undef atomic_add_32 @@ -50,7 +59,6 @@ atomic_op_alias(atomic_add_32,_atomic_ad #undef atomic_add_int atomic_op_alias(atomic_add_int,_atomic_add_32) __strong_alias(_atomic_add_int,_atomic_add_32) -__strong_alias(__sync_fetch_and_add_4,_atomic_add_32) #if !defined(_LP64) #undef atomic_add_long Index: src/common/lib/libc/atomic/atomic_and_32_cas.c diff -u src/common/lib/libc/atomic/atomic_and_32_cas.c:1.5 src/common/lib/libc/atomic/atomic_and_32_cas.c:1.6 --- src/common/lib/libc/atomic/atomic_and_32_cas.c:1.5 Mon Jan 27 18:12:57 2014 +++ src/common/lib/libc/atomic/atomic_and_32_cas.c Mon Jan 27 18:29:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_and_32_cas.c,v 1.5 2014/01/27 18:12:57 matt Exp $ */ +/* $NetBSD: atomic_and_32_cas.c,v 1.6 2014/01/27 18:29:47 matt Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -33,8 +33,10 @@ #include <sys/atomic.h> -void -atomic_and_32(volatile uint32_t *addr, uint32_t val) +uint32_t atomic_and_32(volatile uint32_t *, uint32_t); + +uint32_t +__sync_fetch_and_and_4(volatile uint32_t *addr, uint32_t val) { uint32_t old, new; @@ -42,11 +44,17 @@ atomic_and_32(volatile uint32_t *addr, u old = *addr; new = old & val; } while (atomic_cas_32(addr, old, new) != old); + return old; +} + +void +atomic_and_32(volatile uint32_t *addr, uint32_t val) +{ + (void) __sync_fetch_and_and_4(addr, val); } #undef atomic_and_32 atomic_op_alias(atomic_and_32,_atomic_and_32) -__strong_alias(__sync_fetch_and_and_4,_atomic_and_32) #undef atomic_and_uint atomic_op_alias(atomic_and_uint,_atomic_and_32) Index: src/common/lib/libc/atomic/atomic_or_32_cas.c diff -u src/common/lib/libc/atomic/atomic_or_32_cas.c:1.5 src/common/lib/libc/atomic/atomic_or_32_cas.c:1.6 --- src/common/lib/libc/atomic/atomic_or_32_cas.c:1.5 Mon Jan 27 18:12:57 2014 +++ src/common/lib/libc/atomic/atomic_or_32_cas.c Mon Jan 27 18:29:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_or_32_cas.c,v 1.5 2014/01/27 18:12:57 matt Exp $ */ +/* $NetBSD: atomic_or_32_cas.c,v 1.6 2014/01/27 18:29:47 matt Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -33,8 +33,10 @@ #include <sys/atomic.h> -void -atomic_or_32(volatile uint32_t *addr, uint32_t val) +uint32_t __sync_fetch_and_or_4(volatile uint32_t *, uint32_t); + +uint32_t +__sync_fetch_and_or_4(volatile uint32_t *addr, uint32_t val) { uint32_t old, new; @@ -42,11 +44,17 @@ atomic_or_32(volatile uint32_t *addr, ui old = *addr; new = old | val; } while (atomic_cas_32(addr, old, new) != old); + return old; +} + +void +atomic_or_32(volatile uint32_t *addr, uint32_t val) +{ + (void) __sync_val_compare_and_swap_4(addr, val); } #undef atomic_or_32 atomic_op_alias(atomic_or_32,_atomic_or_32) -__strong_alias(__sync_fetch_and_or_4,_atomic_or_32) #undef atomic_or_uint atomic_op_alias(atomic_or_uint,_atomic_or_32) Index: src/common/lib/libc/atomic/atomic_add_64_cas.c diff -u src/common/lib/libc/atomic/atomic_add_64_cas.c:1.6 src/common/lib/libc/atomic/atomic_add_64_cas.c:1.7 --- src/common/lib/libc/atomic/atomic_add_64_cas.c:1.6 Mon Jan 27 18:09:51 2014 +++ src/common/lib/libc/atomic/atomic_add_64_cas.c Mon Jan 27 18:29:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_add_64_cas.c,v 1.6 2014/01/27 18:09:51 matt Exp $ */ +/* $NetBSD: atomic_add_64_cas.c,v 1.7 2014/01/27 18:29:47 matt Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -35,8 +35,10 @@ #ifdef __HAVE_ATOMIC64_OPS -void -atomic_add_64(volatile uint64_t *addr, int64_t val) +uint64_t __sync_fetch_and_add_8(volatile uint64_t *, int64_t); + +uint64_t +__sync_fetch_and_add_8(volatile uint64_t *addr, int64_t val) { uint64_t old, new; @@ -44,11 +46,17 @@ atomic_add_64(volatile uint64_t *addr, i old = *addr; new = old + val; } while (atomic_cas_64(addr, old, new) != old); + return old; +} + +void +atomic_add_64(volatile uint64_t *addr, int64_t val) +{ + (void) __sync_fetch_and_add_8(addr, val); } #undef atomic_add_64 atomic_op_alias(atomic_add_64,_atomic_add_64) -__strong_alias(__sync_fetch_and_add_8,_atomic_add_64) #if defined(_LP64) #undef atomic_add_long Index: src/common/lib/libc/atomic/atomic_and_64_cas.c diff -u src/common/lib/libc/atomic/atomic_and_64_cas.c:1.6 src/common/lib/libc/atomic/atomic_and_64_cas.c:1.7 --- src/common/lib/libc/atomic/atomic_and_64_cas.c:1.6 Mon Jan 27 18:12:57 2014 +++ src/common/lib/libc/atomic/atomic_and_64_cas.c Mon Jan 27 18:29:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_and_64_cas.c,v 1.6 2014/01/27 18:12:57 matt Exp $ */ +/* $NetBSD: atomic_and_64_cas.c,v 1.7 2014/01/27 18:29:47 matt Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -35,8 +35,10 @@ #ifdef __HAVE_ATOMIC64_OPS -void -atomic_and_64(volatile uint64_t *addr, uint64_t val) +uint64_t __sync_fetch_and_and_8(volatile uint64_t *, uint64_t); + +uint64_t +__sync_fetch_and_and_8(volatile uint64_t *addr, uint64_t val) { uint64_t old, new; @@ -46,9 +48,14 @@ atomic_and_64(volatile uint64_t *addr, u } while (atomic_cas_64(addr, old, new) != old); } +void +atomic_and_64(volatile uint64_t *addr, uint64_t val) +{ + (void) __sync_fetch_and_and_8(addr, val); +} + #undef atomic_and_64 atomic_op_alias(atomic_and_64,_atomic_and_64) -__strong_alias(__sync_fetch_and_and_8,_atomic_and_64) #if defined(_LP64) #undef atomic_and_ulong Index: src/common/lib/libc/atomic/atomic_or_64_cas.c diff -u src/common/lib/libc/atomic/atomic_or_64_cas.c:1.6 src/common/lib/libc/atomic/atomic_or_64_cas.c:1.7 --- src/common/lib/libc/atomic/atomic_or_64_cas.c:1.6 Mon Jan 27 18:12:57 2014 +++ src/common/lib/libc/atomic/atomic_or_64_cas.c Mon Jan 27 18:29:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_or_64_cas.c,v 1.6 2014/01/27 18:12:57 matt Exp $ */ +/* $NetBSD: atomic_or_64_cas.c,v 1.7 2014/01/27 18:29:47 matt Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -35,8 +35,10 @@ #ifdef __HAVE_ATOMIC64_OPS +uint64_t __sync_fetch_and_or_8(volatile uint64_t *addr, uint64_t val); + void -atomic_or_64(volatile uint64_t *addr, uint64_t val) +__sync_fetch_and_or_8(volatile uint64_t *addr, uint64_t val) { uint64_t old, new; @@ -44,11 +46,17 @@ atomic_or_64(volatile uint64_t *addr, ui old = *addr; new = old | val; } while (atomic_cas_64(addr, old, new) != old); + return old; +} + +void +atomic_or_64(volatile uint64_t *addr, uint64_t val) +{ + (void) __sync_fetch_and_or_8(addr, val); } #undef atomic_or_64 atomic_op_alias(atomic_or_64,_atomic_or_64) -__strong_alias(__sync_fetch_and_or_8,_atomic_or_64) #if defined(_LP64) #undef atomic_or_ulong