Make the _and_fetch_8 primitives return the new value they calculated and set - not whatever is found in memory later.diff -r1.1 -r1.2 src/common/lib/libc/atomic/atomic_nand_64_cas.c
(martin)
--- src/common/lib/libc/atomic/atomic_nand_64_cas.c 2014/02/18 10:16:55 1.1
+++ src/common/lib/libc/atomic/atomic_nand_64_cas.c 2014/02/18 13:21:04 1.2
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: atomic_nand_64_cas.c,v 1.1 2014/02/18 10:16:55 martin Exp $ */ | 1 | /* $NetBSD: atomic_nand_64_cas.c,v 1.2 2014/02/18 13:21:04 martin Exp $ */ | |
2 | 2 | |||
3 | /*- | 3 | /*- | |
4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Jason R. Thorpe. | 8 | * by Jason R. Thorpe. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | 13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
@@ -49,17 +49,17 @@ fetch_and_nand_8(volatile uint64_t *addr | @@ -49,17 +49,17 @@ fetch_and_nand_8(volatile uint64_t *addr | |||
49 | } while (atomic_cas_64(addr, old, new) != old); | 49 | } while (atomic_cas_64(addr, old, new) != old); | |
50 | return old; | 50 | return old; | |
51 | } | 51 | } | |
52 | 52 | |||
53 | uint64_t | 53 | uint64_t | |
54 | nand_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | 54 | nand_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | |
55 | { | 55 | { | |
56 | uint64_t old, new; | 56 | uint64_t old, new; | |
57 | 57 | |||
58 | do { | 58 | do { | |
59 | old = *addr; | 59 | old = *addr; | |
60 | new = ~(old & val); | 60 | new = ~(old & val); | |
61 | } while (atomic_cas_64(addr, old, new) != old); | 61 | } while (atomic_cas_64(addr, old, new) != old); | |
62 | return *addr; | 62 | return new; | |
63 | } | 63 | } | |
64 | 64 | |||
65 | #endif | 65 | #endif |
--- src/common/lib/libc/atomic/atomic_sub_64_cas.c 2014/02/18 10:16:55 1.1
+++ src/common/lib/libc/atomic/atomic_sub_64_cas.c 2014/02/18 13:21:04 1.2
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: atomic_sub_64_cas.c,v 1.1 2014/02/18 10:16:55 martin Exp $ */ | 1 | /* $NetBSD: atomic_sub_64_cas.c,v 1.2 2014/02/18 13:21:04 martin Exp $ */ | |
2 | 2 | |||
3 | /*- | 3 | /*- | |
4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Jason R. Thorpe. | 8 | * by Jason R. Thorpe. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | 13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
@@ -49,17 +49,17 @@ fetch_and_sub_8(volatile uint64_t *addr, | @@ -49,17 +49,17 @@ fetch_and_sub_8(volatile uint64_t *addr, | |||
49 | } while (atomic_cas_64(addr, old, new) != old); | 49 | } while (atomic_cas_64(addr, old, new) != old); | |
50 | return old; | 50 | return old; | |
51 | } | 51 | } | |
52 | 52 | |||
53 | uint64_t | 53 | uint64_t | |
54 | sub_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | 54 | sub_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | |
55 | { | 55 | { | |
56 | uint64_t old, new; | 56 | uint64_t old, new; | |
57 | 57 | |||
58 | do { | 58 | do { | |
59 | old = *addr; | 59 | old = *addr; | |
60 | new = old - val; | 60 | new = old - val; | |
61 | } while (atomic_cas_64(addr, old, new) != old); | 61 | } while (atomic_cas_64(addr, old, new) != old); | |
62 | return *addr; | 62 | return new; | |
63 | } | 63 | } | |
64 | 64 | |||
65 | #endif | 65 | #endif |
--- src/common/lib/libc/atomic/atomic_xor_64_cas.c 2014/02/18 10:16:55 1.1
+++ src/common/lib/libc/atomic/atomic_xor_64_cas.c 2014/02/18 13:21:04 1.2
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: atomic_xor_64_cas.c,v 1.1 2014/02/18 10:16:55 martin Exp $ */ | 1 | /* $NetBSD: atomic_xor_64_cas.c,v 1.2 2014/02/18 13:21:04 martin Exp $ */ | |
2 | 2 | |||
3 | /*- | 3 | /*- | |
4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Jason R. Thorpe. | 8 | * by Jason R. Thorpe. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | 13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
@@ -49,17 +49,17 @@ fetch_and_xor_8(volatile uint64_t *addr, | @@ -49,17 +49,17 @@ fetch_and_xor_8(volatile uint64_t *addr, | |||
49 | } while (atomic_cas_64(addr, old, new) != old); | 49 | } while (atomic_cas_64(addr, old, new) != old); | |
50 | return old; | 50 | return old; | |
51 | } | 51 | } | |
52 | 52 | |||
53 | uint64_t | 53 | uint64_t | |
54 | xor_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | 54 | xor_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | |
55 | { | 55 | { | |
56 | uint64_t old, new; | 56 | uint64_t old, new; | |
57 | 57 | |||
58 | do { | 58 | do { | |
59 | old = *addr; | 59 | old = *addr; | |
60 | new = old ^ val; | 60 | new = old ^ val; | |
61 | } while (atomic_cas_64(addr, old, new) != old); | 61 | } while (atomic_cas_64(addr, old, new) != old); | |
62 | return *addr; | 62 | return new; | |
63 | } | 63 | } | |
64 | 64 | |||
65 | #endif | 65 | #endif |