Skip to content

Commit 9208e89

Browse files
committed
---
yaml --- r: 142575 b: refs/heads/try2 c: 8f77a6f h: refs/heads/master i: 142573: 4af518a 142571: f74453b 142567: 2b6afb3 142559: 6d3e854 v: v3
1 parent 3f51130 commit 9208e89

File tree

2 files changed

+56
-7
lines changed

2 files changed

+56
-7
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 6d8d73cfc4cba2fdb2ee67448df39d89be08ce69
8+
refs/heads/try2: 8f77a6f422184dacc14ae1b6a042c321e06bef88
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/unstable/sync.rs

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,25 +208,50 @@ extern {
208208
/* *********************************************************************/
209209

210210
//FIXME: #5042 This should be replaced by proper atomic type
211-
pub struct AtomicUint(uint);
212-
pub impl AtomicUint {
213-
fn load(&self) -> uint {
211+
pub struct AtomicUint {
212+
priv inner: uint
213+
}
214+
215+
impl AtomicUint {
216+
pub fn new(val: uint) -> AtomicUint { AtomicUint { inner: val } }
217+
pub fn load(&self) -> uint {
214218
unsafe { intrinsics::atomic_load(cast::transmute(self)) as uint }
215219
}
216-
fn store(&mut self, val:uint) {
220+
pub fn store(&mut self, val: uint) {
217221
unsafe { intrinsics::atomic_store(cast::transmute(self), val as int); }
218222
}
219-
fn add(&mut self, val:int) -> uint {
223+
pub fn add(&mut self, val: int) -> uint {
220224
unsafe { intrinsics::atomic_xadd(cast::transmute(self), val as int) as uint }
221225
}
222-
fn cas(&self, old:uint, new:uint) -> uint {
226+
pub fn cas(&mut self, old:uint, new: uint) -> uint {
223227
unsafe { intrinsics::atomic_cxchg(cast::transmute(self), old as int, new as int) as uint }
224228
}
225229
}
226230

231+
pub struct AtomicInt {
232+
priv inner: int
233+
}
234+
235+
impl AtomicInt {
236+
pub fn new(val: int) -> AtomicInt { AtomicInt { inner: val } }
237+
pub fn load(&self) -> int {
238+
unsafe { intrinsics::atomic_load(&self.inner) }
239+
}
240+
pub fn store(&mut self, val: int) {
241+
unsafe { intrinsics::atomic_store(&mut self.inner, val); }
242+
}
243+
pub fn add(&mut self, val: int) -> int {
244+
unsafe { intrinsics::atomic_xadd(&mut self.inner, val) }
245+
}
246+
pub fn cas(&mut self, old: int, new: int) -> int {
247+
unsafe { intrinsics::atomic_cxchg(&mut self.inner, old, new) }
248+
}
249+
}
250+
227251

228252
#[cfg(test)]
229253
mod tests {
254+
use super::*;
230255
use comm;
231256
use super::exclusive;
232257
use task;
@@ -278,4 +303,28 @@ mod tests {
278303
assert_eq!(*one, 1);
279304
}
280305
}
306+
307+
#[test]
308+
fn atomic_int_smoke_test() {
309+
let mut i = AtomicInt::new(0);
310+
i.store(10);
311+
assert!(i.load() == 10);
312+
assert!(i.add(1) == 10);
313+
assert!(i.load() == 11);
314+
assert!(i.cas(11, 12) == 11);
315+
assert!(i.cas(11, 13) == 12);
316+
assert!(i.load() == 12);
317+
}
318+
319+
#[test]
320+
fn atomic_uint_smoke_test() {
321+
let mut i = AtomicUint::new(0);
322+
i.store(10);
323+
assert!(i.load() == 10);
324+
assert!(i.add(1) == 10);
325+
assert!(i.load() == 11);
326+
assert!(i.cas(11, 12) == 11);
327+
assert!(i.cas(11, 13) == 12);
328+
assert!(i.load() == 12);
329+
}
281330
}

0 commit comments

Comments
 (0)