]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/intrinsic-atomics.rs
auto merge of #7902 : huonw/rust/attr++, r=cmr,pcwalton
[rust.git] / src / test / run-pass / intrinsic-atomics.rs
1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 mod rusti {
12     #[abi = "rust-intrinsic"]
13     extern "rust-intrinsic" {
14         pub fn atomic_cxchg(dst: &mut int, old: int, src: int) -> int;
15         pub fn atomic_cxchg_acq(dst: &mut int, old: int, src: int) -> int;
16         pub fn atomic_cxchg_rel(dst: &mut int, old: int, src: int) -> int;
17
18         pub fn atomic_load(src: &int) -> int;
19         pub fn atomic_load_acq(src: &int) -> int;
20
21         pub fn atomic_store(dst: &mut int, val: int);
22         pub fn atomic_store_rel(dst: &mut int, val: int);
23
24         pub fn atomic_xchg(dst: &mut int, src: int) -> int;
25         pub fn atomic_xchg_acq(dst: &mut int, src: int) -> int;
26         pub fn atomic_xchg_rel(dst: &mut int, src: int) -> int;
27
28         pub fn atomic_xadd(dst: &mut int, src: int) -> int;
29         pub fn atomic_xadd_acq(dst: &mut int, src: int) -> int;
30         pub fn atomic_xadd_rel(dst: &mut int, src: int) -> int;
31
32         pub fn atomic_xsub(dst: &mut int, src: int) -> int;
33         pub fn atomic_xsub_acq(dst: &mut int, src: int) -> int;
34         pub fn atomic_xsub_rel(dst: &mut int, src: int) -> int;
35     }
36 }
37
38 pub fn main() {
39     unsafe {
40         let mut x = ~1;
41
42         assert_eq!(rusti::atomic_load(x), 1);
43         *x = 5;
44         assert_eq!(rusti::atomic_load_acq(x), 5);
45
46         rusti::atomic_store(x,3);
47         assert_eq!(*x, 3);
48         rusti::atomic_store_rel(x,1);
49         assert_eq!(*x, 1);
50
51         assert_eq!(rusti::atomic_cxchg(x, 1, 2), 1);
52         assert_eq!(*x, 2);
53
54         assert_eq!(rusti::atomic_cxchg_acq(x, 1, 3), 2);
55         assert_eq!(*x, 2);
56
57         assert_eq!(rusti::atomic_cxchg_rel(x, 2, 1), 2);
58         assert_eq!(*x, 1);
59
60         assert_eq!(rusti::atomic_xchg(x, 0), 1);
61         assert_eq!(*x, 0);
62
63         assert_eq!(rusti::atomic_xchg_acq(x, 1), 0);
64         assert_eq!(*x, 1);
65
66         assert_eq!(rusti::atomic_xchg_rel(x, 0), 1);
67         assert_eq!(*x, 0);
68
69         assert_eq!(rusti::atomic_xadd(x, 1), 0);
70         assert_eq!(rusti::atomic_xadd_acq(x, 1), 1);
71         assert_eq!(rusti::atomic_xadd_rel(x, 1), 2);
72         assert_eq!(*x, 3);
73
74         assert_eq!(rusti::atomic_xsub(x, 1), 3);
75         assert_eq!(rusti::atomic_xsub_acq(x, 1), 2);
76         assert_eq!(rusti::atomic_xsub_rel(x, 1), 1);
77         assert_eq!(*x, 0);
78     }
79 }