rust/src/libsync
Huon Wilson 781ac3e777 std: deprecate cast::transmute_mut.
Turning a `&T` into an `&mut T` carries a large risk of undefined
behaviour, and needs to be done very very carefully. Providing a
convenience function for exactly this task is a bad idea, just tempting
people into doing the wrong thing.

The right thing is to use types like `Cell`, `RefCell` or `Unsafe`.

For memory safety, Rust has that guarantee that `&mut` pointers do not
alias with any other pointer, that is, if you have a `&mut T` then that
is the only usable pointer to that `T`. This allows Rust to assume that
writes through a `&mut T` do not affect the values of any other `&` or
`&mut` references. `&` pointers have no guarantees about aliasing or
not, so it's entirely possible for the same pointer to be passed into
both arguments of a function like

    fn foo(x: &int, y: &int) { ... }

Converting either of `x` or `y` to a `&mut` pointer and modifying it
would affect the other value: invalid behaviour.

(Similarly, it's undefined behaviour to modify the value of an immutable
local, like `let x = 1;`.)

At a low-level, the *only* safe way to obtain an `&mut` out of a `&` is
using the `Unsafe` type (there are higher level wrappers around it, like
`Cell`, `RefCell`, `Mutex` etc.). The `Unsafe` type is registered with
the compiler so that it can reason a little about these `&` to `&mut`
casts, but it is still up to the user to ensure that the `&mut`s
obtained out of an `Unsafe` never alias.

(Note that *any* conversion from `&` to `&mut` can be invalid, including
a plain `transmute`, or casting `&T` -> `*T` -> `*mut T` -> `&mut T`.)

[breaking-change]
2014-05-05 18:20:41 +10:00
..
arc.rs std: deprecate cast::transmute_mut. 2014-05-05 18:20:41 +10:00
comm.rs Replace all ~"" with "".to_owned() 2014-04-18 17:25:34 -07:00
future.rs Replace all ~"" with "".to_owned() 2014-04-18 17:25:34 -07:00
lib.rs Register new snapshots 2014-04-04 13:23:08 -07:00
lock.rs Move task::task() to TaskBuilder::new() 2014-04-23 20:02:02 -07:00
mpsc_intrusive.rs sync: Switch field privacy as necessary 2014-03-31 15:47:35 -07:00
mutex.rs sync: Switch field privacy as necessary 2014-03-31 15:47:35 -07:00
one.rs sync: Switch field privacy as necessary 2014-03-31 15:47:35 -07:00
raw.rs Replace most ~exprs with 'box'. #11779 2014-05-02 23:00:58 -07:00
task_pool.rs Register new snapshots 2014-04-08 00:03:11 -07:00