Bug 1568446 - Add UniqueArc::new_uninit, UniqueArc::assume_init. r=emilio

Cherry-picked from: https://github.com/servo/servo/pull/23824
This commit is contained in:
Simon Sapin 2019-07-06 18:15:53 +02:00 коммит произвёл Emilio Cobos Álvarez
Родитель 01547f5575
Коммит ed49247220
1 изменённых файлов: 29 добавлений и 1 удалений

Просмотреть файл

@ -34,7 +34,7 @@ use nodrop::NoDrop;
#[cfg(feature = "servo")]
use serde::{Deserialize, Serialize};
use stable_deref_trait::{CloneStableDeref, StableDeref};
use std::alloc::Layout;
use std::alloc::{self, Layout};
use std::borrow;
use std::cmp::Ordering;
use std::convert::From;
@ -134,6 +134,23 @@ impl<T> UniqueArc<T> {
UniqueArc(Arc::new(data))
}
/// Construct an uninitialized arc
#[inline]
pub fn new_uninit() -> UniqueArc<mem::MaybeUninit<T>> {
unsafe {
let layout = Layout::new::<ArcInner<mem::MaybeUninit<T>>>();
let ptr = alloc::alloc(layout);
let mut p = ptr::NonNull::new(ptr)
.unwrap_or_else(|| alloc::handle_alloc_error(layout))
.cast::<ArcInner<mem::MaybeUninit<T>>>();
ptr::write(&mut p.as_mut().count, atomic::AtomicUsize::new(1));
UniqueArc(Arc {
p,
phantom: PhantomData,
})
}
}
#[inline]
/// Convert to a shareable Arc<T> once we're done mutating it
pub fn shareable(self) -> Arc<T> {
@ -141,6 +158,17 @@ impl<T> UniqueArc<T> {
}
}
impl<T> UniqueArc<mem::MaybeUninit<T>> {
/// Convert to an initialized Arc.
#[inline]
pub unsafe fn assume_init(this: Self) -> UniqueArc<T> {
UniqueArc(Arc {
p: this.0.p.cast(),
phantom: PhantomData,
})
}
}
impl<T> Deref for UniqueArc<T> {
type Target = T;
fn deref(&self) -> &T {