use core::mem::{align_of_val, size_of_val};
use core::intrinsics::abort;
use core::mem;
+use core::mem::uninitialized;
use core::ops::Deref;
-#[cfg(not(stage0))]
use core::ops::CoerceUnsized;
use core::ptr::{self, Shared};
-#[cfg(not(stage0))]
use core::marker::Unsize;
use core::hash::{Hash, Hasher};
use core::{usize, isize};
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
-// remove cfg after new snapshot
-#[cfg(not(stage0))]
#[unstable(feature = "coerce_unsized", issue = "27732")]
impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Arc<U>> for Arc<T> {}
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T: ?Sized + Sync + Send> Sync for Weak<T> {}
-// remove cfg after new snapshot
-#[cfg(not(stage0))]
#[unstable(feature = "coerce_unsized", issue = "27732")]
impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Weak<U>> for Weak<T> {}
// This structure has #[unsafe_no_drop_flag], so this drop glue may run
// more than once (but it is guaranteed to be zeroed after the first if
// it's run more than once)
- let ptr = *self._ptr;
- // if ptr.is_null() { return }
- if ptr as *mut u8 as usize == 0 || ptr as *mut u8 as usize == mem::POST_DROP_USIZE {
+ let thin = *self._ptr as *const ();
+
+ if thin as usize == mem::POST_DROP_USIZE {
return;
}
/// ```
fn drop(&mut self) {
let ptr = *self._ptr;
+ let thin = ptr as *const ();
// see comments above for why this check is here
- if ptr as *mut u8 as usize == 0 || ptr as *mut u8 as usize == mem::POST_DROP_USIZE {
+ if thin as usize == mem::POST_DROP_USIZE {
return;
}
}
}
+impl<T> Weak<T> {
+ /// Constructs a new `Weak<T>` without an accompanying instance of T.
+ ///
+ /// This allocates memory for T, but does not initialize it. Calling
+ /// Weak<T>::upgrade() on the return value always gives None.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// #![feature(downgraded_weak)]
+ ///
+ /// use std::sync::Weak;
+ ///
+ /// let empty: Weak<i64> = Weak::new();
+ /// ```
+ #[unstable(feature = "downgraded_weak",
+ reason = "recently added",
+ issue = "30425")]
+ pub fn new() -> Weak<T> {
+ unsafe {
+ Weak { _ptr: Shared::new(Box::into_raw(box ArcInner {
+ strong: atomic::AtomicUsize::new(0),
+ weak: atomic::AtomicUsize::new(1),
+ data: uninitialized(),
+ }))}
+ }
+ }
+}
+
#[cfg(test)]
mod tests {
use std::clone::Clone;
let foo_arc = Arc::from(foo);
assert!(123 == *foo_arc);
}
+
+ #[test]
+ fn test_new_weak() {
+ let foo: Weak<usize> = Weak::new();
+ assert!(foo.upgrade().is_none());
+ }
}
#[stable(feature = "rust1", since = "1.0.0")]