value,
}
}
+
+ #[inline]
+ fn new_atomic(value: T) -> Self {
+ Self {
+ strong: AtomicI32::new(1),
+ value,
+ }
+ }
}
impl<T: ?Sized> Inner<T> {
impl<T> Arc<T> {
pub fn new(value: T) -> Self {
- Self::from_inner(Box::leak(Box::new(Inner::new(value))).into())
+ Self::from_inner(Box::leak(Box::new(Inner::new_atomic(value))).into())
}
}
mod tests {
use crate::*;
+ #[test]
+ fn rc_drop() {
+ use std::sync::atomic::{AtomicU32, Ordering};
+
+ struct A<'a>(&'a AtomicU32);
+ impl<'a> Drop for A<'a> {
+ fn drop(&mut self) {
+ self.0.fetch_add(1, Ordering::SeqCst);
+ }
+ }
+
+ let counter = AtomicU32::new(0);
+ let a = Arc::new(A(&counter));
+ assert_eq!(counter.load(Ordering::Relaxed), 0);
+ let b = a.clone();
+ assert_eq!(counter.load(Ordering::Relaxed), 0);
+ drop(a);
+ assert_eq!(counter.load(Ordering::Relaxed), 0);
+ drop(b);
+ assert_eq!(counter.load(Ordering::Relaxed), 1);
+ }
+
#[test]
fn rc_double_upgrade() {
let rc1 = Rc::new(());