Skip to content

Commit 8f77a6f

Browse files
committed
core: Add AtomicInt and cleanup
1 parent 6d8d73c commit 8f77a6f

File tree

1 file changed

+55
-6
lines changed

1 file changed

+55
-6
lines changed

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)