Skip to content

Commit ab39158

Browse files
committed
std: Make atomics immutable. rust-lang#11583
In Rust, the strongest guarantee that `&mut` provides is that the memory pointed to is *not aliased*, whereas `&`'s guarantees are much weaker: that the value can be aliased, and may be mutated under proper precautions (interior mutability). Our atomics though use `&mut` for mutation even while creating multiple aliases, so this changes them to use 'interior mutability', mutating through immutable references.
1 parent 68a92c5 commit ab39158

File tree

7 files changed

+855
-121
lines changed

7 files changed

+855
-121
lines changed

src/librustc/middle/typeck/check/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3956,7 +3956,7 @@ pub fn check_intrinsic_type(ccx: @CrateCtxt, it: &ast::ForeignItem) {
39563956

39573957
//We only care about the operation here
39583958
match split[1] {
3959-
"cxchg" => (1, ~[ty::mk_mut_rptr(tcx,
3959+
"cxchg" => (1, ~[ty::mk_imm_rptr(tcx,
39603960
ty::ReLateBound(it.id, ty::BrAnon(0)),
39613961
param(ccx, 0)),
39623962
param(ccx, 0),
@@ -3970,15 +3970,15 @@ pub fn check_intrinsic_type(ccx: @CrateCtxt, it: &ast::ForeignItem) {
39703970
param(ccx, 0)),
39713971
"store" => (1,
39723972
~[
3973-
ty::mk_mut_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
3973+
ty::mk_imm_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
39743974
param(ccx, 0)),
39753975
param(ccx, 0)
39763976
],
39773977
ty::mk_nil()),
39783978

39793979
"xchg" | "xadd" | "xsub" | "and" | "nand" | "or" | "xor" | "max" |
39803980
"min" | "umax" | "umin" => {
3981-
(1, ~[ty::mk_mut_rptr(tcx,
3981+
(1, ~[ty::mk_imm_rptr(tcx,
39823982
ty::ReLateBound(it.id, ty::BrAnon(0)),
39833983
param(ccx, 0)), param(ccx, 0) ],
39843984
param(ccx, 0))

src/libstd/intrinsics.rs

+88
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ pub trait TyVisitor {
164164
fn visit_self(&mut self) -> bool;
165165
}
166166

167+
#[cfg(stage0)]
167168
extern "rust-intrinsic" {
168169
pub fn atomic_cxchg<T>(dst: &mut T, old: T, src: T) -> T;
169170
pub fn atomic_cxchg_acq<T>(dst: &mut T, old: T, src: T) -> T;
@@ -244,6 +245,93 @@ extern "rust-intrinsic" {
244245
pub fn atomic_umax_rel<T>(dst: &mut T, src: T) -> T;
245246
pub fn atomic_umax_acqrel<T>(dst: &mut T, src: T) -> T;
246247
pub fn atomic_umax_relaxed<T>(dst: &mut T, src: T) -> T;
248+
}
249+
250+
#[cfg(not(stage0))]
251+
extern "rust-intrinsic" {
252+
253+
pub fn atomic_cxchg<T>(dst: &T, old: T, src: T) -> T;
254+
pub fn atomic_cxchg_acq<T>(dst: &T, old: T, src: T) -> T;
255+
pub fn atomic_cxchg_rel<T>(dst: &T, old: T, src: T) -> T;
256+
pub fn atomic_cxchg_acqrel<T>(dst: &T, old: T, src: T) -> T;
257+
pub fn atomic_cxchg_relaxed<T>(dst: &T, old: T, src: T) -> T;
258+
259+
pub fn atomic_load<T>(src: &T) -> T;
260+
pub fn atomic_load_acq<T>(src: &T) -> T;
261+
pub fn atomic_load_relaxed<T>(src: &T) -> T;
262+
263+
pub fn atomic_store<T>(dst: &T, val: T);
264+
pub fn atomic_store_rel<T>(dst: &T, val: T);
265+
pub fn atomic_store_relaxed<T>(dst: &T, val: T);
266+
267+
pub fn atomic_xchg<T>(dst: &T, src: T) -> T;
268+
pub fn atomic_xchg_acq<T>(dst: &T, src: T) -> T;
269+
pub fn atomic_xchg_rel<T>(dst: &T, src: T) -> T;
270+
pub fn atomic_xchg_acqrel<T>(dst: &T, src: T) -> T;
271+
pub fn atomic_xchg_relaxed<T>(dst: &T, src: T) -> T;
272+
273+
pub fn atomic_xadd<T>(dst: &T, src: T) -> T;
274+
pub fn atomic_xadd_acq<T>(dst: &T, src: T) -> T;
275+
pub fn atomic_xadd_rel<T>(dst: &T, src: T) -> T;
276+
pub fn atomic_xadd_acqrel<T>(dst: &T, src: T) -> T;
277+
pub fn atomic_xadd_relaxed<T>(dst: &T, src: T) -> T;
278+
279+
pub fn atomic_xsub<T>(dst: &T, src: T) -> T;
280+
pub fn atomic_xsub_acq<T>(dst: &T, src: T) -> T;
281+
pub fn atomic_xsub_rel<T>(dst: &T, src: T) -> T;
282+
pub fn atomic_xsub_acqrel<T>(dst: &T, src: T) -> T;
283+
pub fn atomic_xsub_relaxed<T>(dst: &T, src: T) -> T;
284+
285+
pub fn atomic_and<T>(dst: &T, src: T) -> T;
286+
pub fn atomic_and_acq<T>(dst: &T, src: T) -> T;
287+
pub fn atomic_and_rel<T>(dst: &T, src: T) -> T;
288+
pub fn atomic_and_acqrel<T>(dst: &T, src: T) -> T;
289+
pub fn atomic_and_relaxed<T>(dst: &T, src: T) -> T;
290+
291+
pub fn atomic_nand<T>(dst: &T, src: T) -> T;
292+
pub fn atomic_nand_acq<T>(dst: &T, src: T) -> T;
293+
pub fn atomic_nand_rel<T>(dst: &T, src: T) -> T;
294+
pub fn atomic_nand_acqrel<T>(dst: &T, src: T) -> T;
295+
pub fn atomic_nand_relaxed<T>(dst: &T, src: T) -> T;
296+
297+
pub fn atomic_or<T>(dst: &T, src: T) -> T;
298+
pub fn atomic_or_acq<T>(dst: &T, src: T) -> T;
299+
pub fn atomic_or_rel<T>(dst: &T, src: T) -> T;
300+
pub fn atomic_or_acqrel<T>(dst: &T, src: T) -> T;
301+
pub fn atomic_or_relaxed<T>(dst: &T, src: T) -> T;
302+
303+
pub fn atomic_xor<T>(dst: &T, src: T) -> T;
304+
pub fn atomic_xor_acq<T>(dst: &T, src: T) -> T;
305+
pub fn atomic_xor_rel<T>(dst: &T, src: T) -> T;
306+
pub fn atomic_xor_acqrel<T>(dst: &T, src: T) -> T;
307+
pub fn atomic_xor_relaxed<T>(dst: &T, src: T) -> T;
308+
309+
pub fn atomic_max<T>(dst: &T, src: T) -> T;
310+
pub fn atomic_max_acq<T>(dst: &T, src: T) -> T;
311+
pub fn atomic_max_rel<T>(dst: &T, src: T) -> T;
312+
pub fn atomic_max_acqrel<T>(dst: &T, src: T) -> T;
313+
pub fn atomic_max_relaxed<T>(dst: &T, src: T) -> T;
314+
315+
pub fn atomic_min<T>(dst: &T, src: T) -> T;
316+
pub fn atomic_min_acq<T>(dst: &T, src: T) -> T;
317+
pub fn atomic_min_rel<T>(dst: &T, src: T) -> T;
318+
pub fn atomic_min_acqrel<T>(dst: &T, src: T) -> T;
319+
pub fn atomic_min_relaxed<T>(dst: &T, src: T) -> T;
320+
321+
pub fn atomic_umin<T>(dst: &T, src: T) -> T;
322+
pub fn atomic_umin_acq<T>(dst: &T, src: T) -> T;
323+
pub fn atomic_umin_rel<T>(dst: &T, src: T) -> T;
324+
pub fn atomic_umin_acqrel<T>(dst: &T, src: T) -> T;
325+
pub fn atomic_umin_relaxed<T>(dst: &T, src: T) -> T;
326+
327+
pub fn atomic_umax<T>(dst: &T, src: T) -> T;
328+
pub fn atomic_umax_acq<T>(dst: &T, src: T) -> T;
329+
pub fn atomic_umax_rel<T>(dst: &T, src: T) -> T;
330+
pub fn atomic_umax_acqrel<T>(dst: &T, src: T) -> T;
331+
pub fn atomic_umax_relaxed<T>(dst: &T, src: T) -> T;
332+
}
333+
334+
extern "rust-intrinsic" {
247335

248336
pub fn atomic_fence();
249337
pub fn atomic_fence_acq();

0 commit comments

Comments
 (0)