diff options
| author | bors <bors@rust-lang.org> | 2014-12-27 13:11:48 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-12-27 13:11:48 +0000 |
| commit | 4a4c89c7a4a763c253a97ff04647f52aca6a5490 (patch) | |
| tree | e7d313c7ebc0418284ea65089db287cca633bc99 /src/liballoc | |
| parent | 9be54be15b4b4ba5c1b22d958d7619a5154ab469 (diff) | |
| parent | 1a73ccc8db0a10e82632808e058645f2d6fa0095 (diff) | |
| download | rust-4a4c89c7a4a763c253a97ff04647f52aca6a5490.tar.gz rust-4a4c89c7a4a763c253a97ff04647f52aca6a5490.zip | |
auto merge of #20119 : FlaPer87/rust/oibit-send-and-friends, r=nikomatsakis
More work on opt-in built in traits. `Send` and `Sync` are not opt-in, `OwnedPtr` renamed to `UniquePtr` and the `Send` and `Sync` traits are now unsafe. NOTE: This likely needs to be rebased on top of the yet-to-land snapshot. r? @nikomatsakis cc #13231
Diffstat (limited to 'src/liballoc')
| -rw-r--r-- | src/liballoc/arc.rs | 13 | ||||
| -rw-r--r-- | src/liballoc/boxed.rs | 3 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/liballoc/arc.rs b/src/liballoc/arc.rs index 893c9d250b7..8d8bbb42932 100644 --- a/src/liballoc/arc.rs +++ b/src/liballoc/arc.rs @@ -117,6 +117,10 @@ pub struct Arc<T> { _ptr: *mut ArcInner<T>, } +unsafe impl<T: Sync + Send> Send for Arc<T> { } +unsafe impl<T: Sync + Send> Sync for Arc<T> { } + + /// A weak pointer to an `Arc`. /// /// Weak pointers will not keep the data inside of the `Arc` alive, and can be used to break cycles @@ -129,13 +133,19 @@ pub struct Weak<T> { _ptr: *mut ArcInner<T>, } +unsafe impl<T: Sync + Send> Send for Weak<T> { } +unsafe impl<T: Sync + Send> Sync for Weak<T> { } + struct ArcInner<T> { strong: atomic::AtomicUint, weak: atomic::AtomicUint, data: T, } -impl<T: Sync + Send> Arc<T> { +unsafe impl<T: Sync + Send> Send for ArcInner<T> {} +unsafe impl<T: Sync + Send> Sync for ArcInner<T> {} + +impl<T> Arc<T> { /// Constructs a new `Arc<T>`. /// /// # Examples @@ -587,6 +597,7 @@ mod tests { use std::str::Str; use std::sync::atomic; use std::task; + use std::kinds::Send; use std::vec::Vec; use super::{Arc, Weak, weak_count, strong_count}; use std::sync::Mutex; diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs index 5fd234192c5..3c6b2d2cbc0 100644 --- a/src/liballoc/boxed.rs +++ b/src/liballoc/boxed.rs @@ -19,6 +19,7 @@ use core::hash::{mod, Hash}; use core::kinds::Sized; use core::mem; use core::option::Option; +use core::ptr::Unique; use core::raw::TraitObject; use core::result::Result; use core::result::Result::{Ok, Err}; @@ -44,7 +45,7 @@ pub static HEAP: () = (); /// A type that represents a uniquely-owned value. #[lang = "owned_box"] #[unstable = "custom allocators will add an additional type parameter (with default)"] -pub struct Box<T>(*mut T); +pub struct Box<T>(Unique<T>); #[stable] impl<T: Default> Default for Box<T> { |
