]> git.lizzy.rs Git - rust.git/blob - library/alloc/src/sync.rs
Rollup merge of #87180 - notriddle:notriddle/sidebar-keyboard-mobile, r=GuillaumeGomez
[rust.git] / library / alloc / src / sync.rs
1 #![stable(feature = "rust1", since = "1.0.0")]
2
3 //! Thread-safe reference-counting pointers.
4 //!
5 //! See the [`Arc<T>`][Arc] documentation for more details.
6
7 use core::any::Any;
8 use core::borrow;
9 use core::cmp::Ordering;
10 use core::convert::{From, TryFrom};
11 use core::fmt;
12 use core::hash::{Hash, Hasher};
13 use core::hint;
14 use core::intrinsics::abort;
15 #[cfg(not(no_global_oom_handling))]
16 use core::iter;
17 use core::marker::{PhantomData, Unpin, Unsize};
18 #[cfg(not(no_global_oom_handling))]
19 use core::mem::size_of_val;
20 use core::mem::{self, align_of_val_raw};
21 use core::ops::{CoerceUnsized, Deref, DispatchFromDyn, Receiver};
22 use core::pin::Pin;
23 use core::ptr::{self, NonNull};
24 #[cfg(not(no_global_oom_handling))]
25 use core::slice::from_raw_parts_mut;
26 use core::sync::atomic;
27 use core::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst};
28
29 #[cfg(not(no_global_oom_handling))]
30 use crate::alloc::handle_alloc_error;
31 #[cfg(not(no_global_oom_handling))]
32 use crate::alloc::{box_free, WriteCloneIntoRaw};
33 use crate::alloc::{AllocError, Allocator, Global, Layout};
34 use crate::borrow::{Cow, ToOwned};
35 use crate::boxed::Box;
36 use crate::rc::is_dangling;
37 #[cfg(not(no_global_oom_handling))]
38 use crate::string::String;
39 #[cfg(not(no_global_oom_handling))]
40 use crate::vec::Vec;
41
42 #[cfg(test)]
43 mod tests;
44
45 /// A soft limit on the amount of references that may be made to an `Arc`.
46 ///
47 /// Going above this limit will abort your program (although not
48 /// necessarily) at _exactly_ `MAX_REFCOUNT + 1` references.
49 const MAX_REFCOUNT: usize = (isize::MAX) as usize;
50
51 #[cfg(not(sanitize = "thread"))]
52 macro_rules! acquire {
53     ($x:expr) => {
54         atomic::fence(Acquire)
55     };
56 }
57
58 // ThreadSanitizer does not support memory fences. To avoid false positive
59 // reports in Arc / Weak implementation use atomic loads for synchronization
60 // instead.
61 #[cfg(sanitize = "thread")]
62 macro_rules! acquire {
63     ($x:expr) => {
64         $x.load(Acquire)
65     };
66 }
67
68 /// A thread-safe reference-counting pointer. 'Arc' stands for 'Atomically
69 /// Reference Counted'.
70 ///
71 /// The type `Arc<T>` provides shared ownership of a value of type `T`,
72 /// allocated in the heap. Invoking [`clone`][clone] on `Arc` produces
73 /// a new `Arc` instance, which points to the same allocation on the heap as the
74 /// source `Arc`, while increasing a reference count. When the last `Arc`
75 /// pointer to a given allocation is destroyed, the value stored in that allocation (often
76 /// referred to as "inner value") is also dropped.
77 ///
78 /// Shared references in Rust disallow mutation by default, and `Arc` is no
79 /// exception: you cannot generally obtain a mutable reference to something
80 /// inside an `Arc`. If you need to mutate through an `Arc`, use
81 /// [`Mutex`][mutex], [`RwLock`][rwlock], or one of the [`Atomic`][atomic]
82 /// types.
83 ///
84 /// ## Thread Safety
85 ///
86 /// Unlike [`Rc<T>`], `Arc<T>` uses atomic operations for its reference
87 /// counting. This means that it is thread-safe. The disadvantage is that
88 /// atomic operations are more expensive than ordinary memory accesses. If you
89 /// are not sharing reference-counted allocations between threads, consider using
90 /// [`Rc<T>`] for lower overhead. [`Rc<T>`] is a safe default, because the
91 /// compiler will catch any attempt to send an [`Rc<T>`] between threads.
92 /// However, a library might choose `Arc<T>` in order to give library consumers
93 /// more flexibility.
94 ///
95 /// `Arc<T>` will implement [`Send`] and [`Sync`] as long as the `T` implements
96 /// [`Send`] and [`Sync`]. Why can't you put a non-thread-safe type `T` in an
97 /// `Arc<T>` to make it thread-safe? This may be a bit counter-intuitive at
98 /// first: after all, isn't the point of `Arc<T>` thread safety? The key is
99 /// this: `Arc<T>` makes it thread safe to have multiple ownership of the same
100 /// data, but it  doesn't add thread safety to its data. Consider
101 /// `Arc<`[`RefCell<T>`]`>`. [`RefCell<T>`] isn't [`Sync`], and if `Arc<T>` was always
102 /// [`Send`], `Arc<`[`RefCell<T>`]`>` would be as well. But then we'd have a problem:
103 /// [`RefCell<T>`] is not thread safe; it keeps track of the borrowing count using
104 /// non-atomic operations.
105 ///
106 /// In the end, this means that you may need to pair `Arc<T>` with some sort of
107 /// [`std::sync`] type, usually [`Mutex<T>`][mutex].
108 ///
109 /// ## Breaking cycles with `Weak`
110 ///
111 /// The [`downgrade`][downgrade] method can be used to create a non-owning
112 /// [`Weak`] pointer. A [`Weak`] pointer can be [`upgrade`][upgrade]d
113 /// to an `Arc`, but this will return [`None`] if the value stored in the allocation has
114 /// already been dropped. In other words, `Weak` pointers do not keep the value
115 /// inside the allocation alive; however, they *do* keep the allocation
116 /// (the backing store for the value) alive.
117 ///
118 /// A cycle between `Arc` pointers will never be deallocated. For this reason,
119 /// [`Weak`] is used to break cycles. For example, a tree could have
120 /// strong `Arc` pointers from parent nodes to children, and [`Weak`]
121 /// pointers from children back to their parents.
122 ///
123 /// # Cloning references
124 ///
125 /// Creating a new reference from an existing reference-counted pointer is done using the
126 /// `Clone` trait implemented for [`Arc<T>`][Arc] and [`Weak<T>`][Weak].
127 ///
128 /// ```
129 /// use std::sync::Arc;
130 /// let foo = Arc::new(vec![1.0, 2.0, 3.0]);
131 /// // The two syntaxes below are equivalent.
132 /// let a = foo.clone();
133 /// let b = Arc::clone(&foo);
134 /// // a, b, and foo are all Arcs that point to the same memory location
135 /// ```
136 ///
137 /// ## `Deref` behavior
138 ///
139 /// `Arc<T>` automatically dereferences to `T` (via the [`Deref`][deref] trait),
140 /// so you can call `T`'s methods on a value of type `Arc<T>`. To avoid name
141 /// clashes with `T`'s methods, the methods of `Arc<T>` itself are associated
142 /// functions, called using [fully qualified syntax]:
143 ///
144 /// ```
145 /// use std::sync::Arc;
146 ///
147 /// let my_arc = Arc::new(());
148 /// Arc::downgrade(&my_arc);
149 /// ```
150 ///
151 /// `Arc<T>`'s implementations of traits like `Clone` may also be called using
152 /// fully qualified syntax. Some people prefer to use fully qualified syntax,
153 /// while others prefer using method-call syntax.
154 ///
155 /// ```
156 /// use std::sync::Arc;
157 ///
158 /// let arc = Arc::new(());
159 /// // Method-call syntax
160 /// let arc2 = arc.clone();
161 /// // Fully qualified syntax
162 /// let arc3 = Arc::clone(&arc);
163 /// ```
164 ///
165 /// [`Weak<T>`][Weak] does not auto-dereference to `T`, because the inner value may have
166 /// already been dropped.
167 ///
168 /// [`Rc<T>`]: crate::rc::Rc
169 /// [clone]: Clone::clone
170 /// [mutex]: ../../std/sync/struct.Mutex.html
171 /// [rwlock]: ../../std/sync/struct.RwLock.html
172 /// [atomic]: core::sync::atomic
173 /// [`Send`]: core::marker::Send
174 /// [`Sync`]: core::marker::Sync
175 /// [deref]: core::ops::Deref
176 /// [downgrade]: Arc::downgrade
177 /// [upgrade]: Weak::upgrade
178 /// [`RefCell<T>`]: core::cell::RefCell
179 /// [`std::sync`]: ../../std/sync/index.html
180 /// [`Arc::clone(&from)`]: Arc::clone
181 /// [fully qualified syntax]: https://doc.rust-lang.org/book/ch19-03-advanced-traits.html#fully-qualified-syntax-for-disambiguation-calling-methods-with-the-same-name
182 ///
183 /// # Examples
184 ///
185 /// Sharing some immutable data between threads:
186 ///
187 // Note that we **do not** run these tests here. The windows builders get super
188 // unhappy if a thread outlives the main thread and then exits at the same time
189 // (something deadlocks) so we just avoid this entirely by not running these
190 // tests.
191 /// ```no_run
192 /// use std::sync::Arc;
193 /// use std::thread;
194 ///
195 /// let five = Arc::new(5);
196 ///
197 /// for _ in 0..10 {
198 ///     let five = Arc::clone(&five);
199 ///
200 ///     thread::spawn(move || {
201 ///         println!("{:?}", five);
202 ///     });
203 /// }
204 /// ```
205 ///
206 /// Sharing a mutable [`AtomicUsize`]:
207 ///
208 /// [`AtomicUsize`]: core::sync::atomic::AtomicUsize
209 ///
210 /// ```no_run
211 /// use std::sync::Arc;
212 /// use std::sync::atomic::{AtomicUsize, Ordering};
213 /// use std::thread;
214 ///
215 /// let val = Arc::new(AtomicUsize::new(5));
216 ///
217 /// for _ in 0..10 {
218 ///     let val = Arc::clone(&val);
219 ///
220 ///     thread::spawn(move || {
221 ///         let v = val.fetch_add(1, Ordering::SeqCst);
222 ///         println!("{:?}", v);
223 ///     });
224 /// }
225 /// ```
226 ///
227 /// See the [`rc` documentation][rc_examples] for more examples of reference
228 /// counting in general.
229 ///
230 /// [rc_examples]: crate::rc#examples
231 #[cfg_attr(not(test), rustc_diagnostic_item = "Arc")]
232 #[stable(feature = "rust1", since = "1.0.0")]
233 pub struct Arc<T: ?Sized> {
234     ptr: NonNull<ArcInner<T>>,
235     phantom: PhantomData<ArcInner<T>>,
236 }
237
238 #[stable(feature = "rust1", since = "1.0.0")]
239 unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
240 #[stable(feature = "rust1", since = "1.0.0")]
241 unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
242
243 #[unstable(feature = "coerce_unsized", issue = "27732")]
244 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Arc<U>> for Arc<T> {}
245
246 #[unstable(feature = "dispatch_from_dyn", issue = "none")]
247 impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Arc<U>> for Arc<T> {}
248
249 impl<T: ?Sized> Arc<T> {
250     fn from_inner(ptr: NonNull<ArcInner<T>>) -> Self {
251         Self { ptr, phantom: PhantomData }
252     }
253
254     unsafe fn from_ptr(ptr: *mut ArcInner<T>) -> Self {
255         unsafe { Self::from_inner(NonNull::new_unchecked(ptr)) }
256     }
257 }
258
259 /// `Weak` is a version of [`Arc`] that holds a non-owning reference to the
260 /// managed allocation. The allocation is accessed by calling [`upgrade`] on the `Weak`
261 /// pointer, which returns an [`Option`]`<`[`Arc`]`<T>>`.
262 ///
263 /// Since a `Weak` reference does not count towards ownership, it will not
264 /// prevent the value stored in the allocation from being dropped, and `Weak` itself makes no
265 /// guarantees about the value still being present. Thus it may return [`None`]
266 /// when [`upgrade`]d. Note however that a `Weak` reference *does* prevent the allocation
267 /// itself (the backing store) from being deallocated.
268 ///
269 /// A `Weak` pointer is useful for keeping a temporary reference to the allocation
270 /// managed by [`Arc`] without preventing its inner value from being dropped. It is also used to
271 /// prevent circular references between [`Arc`] pointers, since mutual owning references
272 /// would never allow either [`Arc`] to be dropped. For example, a tree could
273 /// have strong [`Arc`] pointers from parent nodes to children, and `Weak`
274 /// pointers from children back to their parents.
275 ///
276 /// The typical way to obtain a `Weak` pointer is to call [`Arc::downgrade`].
277 ///
278 /// [`upgrade`]: Weak::upgrade
279 #[stable(feature = "arc_weak", since = "1.4.0")]
280 pub struct Weak<T: ?Sized> {
281     // This is a `NonNull` to allow optimizing the size of this type in enums,
282     // but it is not necessarily a valid pointer.
283     // `Weak::new` sets this to `usize::MAX` so that it doesn’t need
284     // to allocate space on the heap.  That's not a value a real pointer
285     // will ever have because RcBox has alignment at least 2.
286     // This is only possible when `T: Sized`; unsized `T` never dangle.
287     ptr: NonNull<ArcInner<T>>,
288 }
289
290 #[stable(feature = "arc_weak", since = "1.4.0")]
291 unsafe impl<T: ?Sized + Sync + Send> Send for Weak<T> {}
292 #[stable(feature = "arc_weak", since = "1.4.0")]
293 unsafe impl<T: ?Sized + Sync + Send> Sync for Weak<T> {}
294
295 #[unstable(feature = "coerce_unsized", issue = "27732")]
296 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Weak<U>> for Weak<T> {}
297 #[unstable(feature = "dispatch_from_dyn", issue = "none")]
298 impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Weak<U>> for Weak<T> {}
299
300 #[stable(feature = "arc_weak", since = "1.4.0")]
301 impl<T: ?Sized + fmt::Debug> fmt::Debug for Weak<T> {
302     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
303         write!(f, "(Weak)")
304     }
305 }
306
307 // This is repr(C) to future-proof against possible field-reordering, which
308 // would interfere with otherwise safe [into|from]_raw() of transmutable
309 // inner types.
310 #[repr(C)]
311 struct ArcInner<T: ?Sized> {
312     strong: atomic::AtomicUsize,
313
314     // the value usize::MAX acts as a sentinel for temporarily "locking" the
315     // ability to upgrade weak pointers or downgrade strong ones; this is used
316     // to avoid races in `make_mut` and `get_mut`.
317     weak: atomic::AtomicUsize,
318
319     data: T,
320 }
321
322 unsafe impl<T: ?Sized + Sync + Send> Send for ArcInner<T> {}
323 unsafe impl<T: ?Sized + Sync + Send> Sync for ArcInner<T> {}
324
325 impl<T> Arc<T> {
326     /// Constructs a new `Arc<T>`.
327     ///
328     /// # Examples
329     ///
330     /// ```
331     /// use std::sync::Arc;
332     ///
333     /// let five = Arc::new(5);
334     /// ```
335     #[cfg(not(no_global_oom_handling))]
336     #[inline]
337     #[stable(feature = "rust1", since = "1.0.0")]
338     pub fn new(data: T) -> Arc<T> {
339         // Start the weak pointer count as 1 which is the weak pointer that's
340         // held by all the strong pointers (kinda), see std/rc.rs for more info
341         let x: Box<_> = box ArcInner {
342             strong: atomic::AtomicUsize::new(1),
343             weak: atomic::AtomicUsize::new(1),
344             data,
345         };
346         Self::from_inner(Box::leak(x).into())
347     }
348
349     /// Constructs a new `Arc<T>` using a weak reference to itself. Attempting
350     /// to upgrade the weak reference before this function returns will result
351     /// in a `None` value. However, the weak reference may be cloned freely and
352     /// stored for use at a later time.
353     ///
354     /// # Examples
355     /// ```
356     /// #![feature(arc_new_cyclic)]
357     /// #![allow(dead_code)]
358     ///
359     /// use std::sync::{Arc, Weak};
360     ///
361     /// struct Foo {
362     ///     me: Weak<Foo>,
363     /// }
364     ///
365     /// let foo = Arc::new_cyclic(|me| Foo {
366     ///     me: me.clone(),
367     /// });
368     /// ```
369     #[cfg(not(no_global_oom_handling))]
370     #[inline]
371     #[unstable(feature = "arc_new_cyclic", issue = "75861")]
372     pub fn new_cyclic(data_fn: impl FnOnce(&Weak<T>) -> T) -> Arc<T> {
373         // Construct the inner in the "uninitialized" state with a single
374         // weak reference.
375         let uninit_ptr: NonNull<_> = Box::leak(box ArcInner {
376             strong: atomic::AtomicUsize::new(0),
377             weak: atomic::AtomicUsize::new(1),
378             data: mem::MaybeUninit::<T>::uninit(),
379         })
380         .into();
381         let init_ptr: NonNull<ArcInner<T>> = uninit_ptr.cast();
382
383         let weak = Weak { ptr: init_ptr };
384
385         // It's important we don't give up ownership of the weak pointer, or
386         // else the memory might be freed by the time `data_fn` returns. If
387         // we really wanted to pass ownership, we could create an additional
388         // weak pointer for ourselves, but this would result in additional
389         // updates to the weak reference count which might not be necessary
390         // otherwise.
391         let data = data_fn(&weak);
392
393         // Now we can properly initialize the inner value and turn our weak
394         // reference into a strong reference.
395         unsafe {
396             let inner = init_ptr.as_ptr();
397             ptr::write(ptr::addr_of_mut!((*inner).data), data);
398
399             // The above write to the data field must be visible to any threads which
400             // observe a non-zero strong count. Therefore we need at least "Release" ordering
401             // in order to synchronize with the `compare_exchange_weak` in `Weak::upgrade`.
402             //
403             // "Acquire" ordering is not required. When considering the possible behaviours
404             // of `data_fn` we only need to look at what it could do with a reference to a
405             // non-upgradeable `Weak`:
406             // - It can *clone* the `Weak`, increasing the weak reference count.
407             // - It can drop those clones, decreasing the weak reference count (but never to zero).
408             //
409             // These side effects do not impact us in any way, and no other side effects are
410             // possible with safe code alone.
411             let prev_value = (*inner).strong.fetch_add(1, Release);
412             debug_assert_eq!(prev_value, 0, "No prior strong references should exist");
413         }
414
415         let strong = Arc::from_inner(init_ptr);
416
417         // Strong references should collectively own a shared weak reference,
418         // so don't run the destructor for our old weak reference.
419         mem::forget(weak);
420         strong
421     }
422
423     /// Constructs a new `Arc` with uninitialized contents.
424     ///
425     /// # Examples
426     ///
427     /// ```
428     /// #![feature(new_uninit)]
429     /// #![feature(get_mut_unchecked)]
430     ///
431     /// use std::sync::Arc;
432     ///
433     /// let mut five = Arc::<u32>::new_uninit();
434     ///
435     /// let five = unsafe {
436     ///     // Deferred initialization:
437     ///     Arc::get_mut_unchecked(&mut five).as_mut_ptr().write(5);
438     ///
439     ///     five.assume_init()
440     /// };
441     ///
442     /// assert_eq!(*five, 5)
443     /// ```
444     #[cfg(not(no_global_oom_handling))]
445     #[unstable(feature = "new_uninit", issue = "63291")]
446     pub fn new_uninit() -> Arc<mem::MaybeUninit<T>> {
447         unsafe {
448             Arc::from_ptr(Arc::allocate_for_layout(
449                 Layout::new::<T>(),
450                 |layout| Global.allocate(layout),
451                 |mem| mem as *mut ArcInner<mem::MaybeUninit<T>>,
452             ))
453         }
454     }
455
456     /// Constructs a new `Arc` with uninitialized contents, with the memory
457     /// being filled with `0` bytes.
458     ///
459     /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
460     /// of this method.
461     ///
462     /// # Examples
463     ///
464     /// ```
465     /// #![feature(new_uninit)]
466     ///
467     /// use std::sync::Arc;
468     ///
469     /// let zero = Arc::<u32>::new_zeroed();
470     /// let zero = unsafe { zero.assume_init() };
471     ///
472     /// assert_eq!(*zero, 0)
473     /// ```
474     ///
475     /// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
476     #[cfg(not(no_global_oom_handling))]
477     #[unstable(feature = "new_uninit", issue = "63291")]
478     pub fn new_zeroed() -> Arc<mem::MaybeUninit<T>> {
479         unsafe {
480             Arc::from_ptr(Arc::allocate_for_layout(
481                 Layout::new::<T>(),
482                 |layout| Global.allocate_zeroed(layout),
483                 |mem| mem as *mut ArcInner<mem::MaybeUninit<T>>,
484             ))
485         }
486     }
487
488     /// Constructs a new `Pin<Arc<T>>`. If `T` does not implement `Unpin`, then
489     /// `data` will be pinned in memory and unable to be moved.
490     #[cfg(not(no_global_oom_handling))]
491     #[stable(feature = "pin", since = "1.33.0")]
492     pub fn pin(data: T) -> Pin<Arc<T>> {
493         unsafe { Pin::new_unchecked(Arc::new(data)) }
494     }
495
496     /// Constructs a new `Pin<Arc<T>>`, return an error if allocation fails.
497     #[unstable(feature = "allocator_api", issue = "32838")]
498     #[inline]
499     pub fn try_pin(data: T) -> Result<Pin<Arc<T>>, AllocError> {
500         unsafe { Ok(Pin::new_unchecked(Arc::try_new(data)?)) }
501     }
502
503     /// Constructs a new `Arc<T>`, returning an error if allocation fails.
504     ///
505     /// # Examples
506     ///
507     /// ```
508     /// #![feature(allocator_api)]
509     /// use std::sync::Arc;
510     ///
511     /// let five = Arc::try_new(5)?;
512     /// # Ok::<(), std::alloc::AllocError>(())
513     /// ```
514     #[unstable(feature = "allocator_api", issue = "32838")]
515     #[inline]
516     pub fn try_new(data: T) -> Result<Arc<T>, AllocError> {
517         // Start the weak pointer count as 1 which is the weak pointer that's
518         // held by all the strong pointers (kinda), see std/rc.rs for more info
519         let x: Box<_> = Box::try_new(ArcInner {
520             strong: atomic::AtomicUsize::new(1),
521             weak: atomic::AtomicUsize::new(1),
522             data,
523         })?;
524         Ok(Self::from_inner(Box::leak(x).into()))
525     }
526
527     /// Constructs a new `Arc` with uninitialized contents, returning an error
528     /// if allocation fails.
529     ///
530     /// # Examples
531     ///
532     /// ```
533     /// #![feature(new_uninit, allocator_api)]
534     /// #![feature(get_mut_unchecked)]
535     ///
536     /// use std::sync::Arc;
537     ///
538     /// let mut five = Arc::<u32>::try_new_uninit()?;
539     ///
540     /// let five = unsafe {
541     ///     // Deferred initialization:
542     ///     Arc::get_mut_unchecked(&mut five).as_mut_ptr().write(5);
543     ///
544     ///     five.assume_init()
545     /// };
546     ///
547     /// assert_eq!(*five, 5);
548     /// # Ok::<(), std::alloc::AllocError>(())
549     /// ```
550     #[unstable(feature = "allocator_api", issue = "32838")]
551     // #[unstable(feature = "new_uninit", issue = "63291")]
552     pub fn try_new_uninit() -> Result<Arc<mem::MaybeUninit<T>>, AllocError> {
553         unsafe {
554             Ok(Arc::from_ptr(Arc::try_allocate_for_layout(
555                 Layout::new::<T>(),
556                 |layout| Global.allocate(layout),
557                 |mem| mem as *mut ArcInner<mem::MaybeUninit<T>>,
558             )?))
559         }
560     }
561
562     /// Constructs a new `Arc` with uninitialized contents, with the memory
563     /// being filled with `0` bytes, returning an error if allocation fails.
564     ///
565     /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
566     /// of this method.
567     ///
568     /// # Examples
569     ///
570     /// ```
571     /// #![feature(new_uninit, allocator_api)]
572     ///
573     /// use std::sync::Arc;
574     ///
575     /// let zero = Arc::<u32>::try_new_zeroed()?;
576     /// let zero = unsafe { zero.assume_init() };
577     ///
578     /// assert_eq!(*zero, 0);
579     /// # Ok::<(), std::alloc::AllocError>(())
580     /// ```
581     ///
582     /// [zeroed]: mem::MaybeUninit::zeroed
583     #[unstable(feature = "allocator_api", issue = "32838")]
584     // #[unstable(feature = "new_uninit", issue = "63291")]
585     pub fn try_new_zeroed() -> Result<Arc<mem::MaybeUninit<T>>, AllocError> {
586         unsafe {
587             Ok(Arc::from_ptr(Arc::try_allocate_for_layout(
588                 Layout::new::<T>(),
589                 |layout| Global.allocate_zeroed(layout),
590                 |mem| mem as *mut ArcInner<mem::MaybeUninit<T>>,
591             )?))
592         }
593     }
594     /// Returns the inner value, if the `Arc` has exactly one strong reference.
595     ///
596     /// Otherwise, an [`Err`] is returned with the same `Arc` that was
597     /// passed in.
598     ///
599     /// This will succeed even if there are outstanding weak references.
600     ///
601     /// # Examples
602     ///
603     /// ```
604     /// use std::sync::Arc;
605     ///
606     /// let x = Arc::new(3);
607     /// assert_eq!(Arc::try_unwrap(x), Ok(3));
608     ///
609     /// let x = Arc::new(4);
610     /// let _y = Arc::clone(&x);
611     /// assert_eq!(*Arc::try_unwrap(x).unwrap_err(), 4);
612     /// ```
613     #[inline]
614     #[stable(feature = "arc_unique", since = "1.4.0")]
615     pub fn try_unwrap(this: Self) -> Result<T, Self> {
616         if this.inner().strong.compare_exchange(1, 0, Relaxed, Relaxed).is_err() {
617             return Err(this);
618         }
619
620         acquire!(this.inner().strong);
621
622         unsafe {
623             let elem = ptr::read(&this.ptr.as_ref().data);
624
625             // Make a weak pointer to clean up the implicit strong-weak reference
626             let _weak = Weak { ptr: this.ptr };
627             mem::forget(this);
628
629             Ok(elem)
630         }
631     }
632 }
633
634 impl<T> Arc<[T]> {
635     /// Constructs a new atomically reference-counted slice with uninitialized contents.
636     ///
637     /// # Examples
638     ///
639     /// ```
640     /// #![feature(new_uninit)]
641     /// #![feature(get_mut_unchecked)]
642     ///
643     /// use std::sync::Arc;
644     ///
645     /// let mut values = Arc::<[u32]>::new_uninit_slice(3);
646     ///
647     /// let values = unsafe {
648     ///     // Deferred initialization:
649     ///     Arc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(1);
650     ///     Arc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(2);
651     ///     Arc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(3);
652     ///
653     ///     values.assume_init()
654     /// };
655     ///
656     /// assert_eq!(*values, [1, 2, 3])
657     /// ```
658     #[cfg(not(no_global_oom_handling))]
659     #[unstable(feature = "new_uninit", issue = "63291")]
660     pub fn new_uninit_slice(len: usize) -> Arc<[mem::MaybeUninit<T>]> {
661         unsafe { Arc::from_ptr(Arc::allocate_for_slice(len)) }
662     }
663
664     /// Constructs a new atomically reference-counted slice with uninitialized contents, with the memory being
665     /// filled with `0` bytes.
666     ///
667     /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and
668     /// incorrect usage of this method.
669     ///
670     /// # Examples
671     ///
672     /// ```
673     /// #![feature(new_uninit)]
674     ///
675     /// use std::sync::Arc;
676     ///
677     /// let values = Arc::<[u32]>::new_zeroed_slice(3);
678     /// let values = unsafe { values.assume_init() };
679     ///
680     /// assert_eq!(*values, [0, 0, 0])
681     /// ```
682     ///
683     /// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
684     #[cfg(not(no_global_oom_handling))]
685     #[unstable(feature = "new_uninit", issue = "63291")]
686     pub fn new_zeroed_slice(len: usize) -> Arc<[mem::MaybeUninit<T>]> {
687         unsafe {
688             Arc::from_ptr(Arc::allocate_for_layout(
689                 Layout::array::<T>(len).unwrap(),
690                 |layout| Global.allocate_zeroed(layout),
691                 |mem| {
692                     ptr::slice_from_raw_parts_mut(mem as *mut T, len)
693                         as *mut ArcInner<[mem::MaybeUninit<T>]>
694                 },
695             ))
696         }
697     }
698 }
699
700 impl<T> Arc<mem::MaybeUninit<T>> {
701     /// Converts to `Arc<T>`.
702     ///
703     /// # Safety
704     ///
705     /// As with [`MaybeUninit::assume_init`],
706     /// it is up to the caller to guarantee that the inner value
707     /// really is in an initialized state.
708     /// Calling this when the content is not yet fully initialized
709     /// causes immediate undefined behavior.
710     ///
711     /// [`MaybeUninit::assume_init`]: ../../std/mem/union.MaybeUninit.html#method.assume_init
712     ///
713     /// # Examples
714     ///
715     /// ```
716     /// #![feature(new_uninit)]
717     /// #![feature(get_mut_unchecked)]
718     ///
719     /// use std::sync::Arc;
720     ///
721     /// let mut five = Arc::<u32>::new_uninit();
722     ///
723     /// let five = unsafe {
724     ///     // Deferred initialization:
725     ///     Arc::get_mut_unchecked(&mut five).as_mut_ptr().write(5);
726     ///
727     ///     five.assume_init()
728     /// };
729     ///
730     /// assert_eq!(*five, 5)
731     /// ```
732     #[unstable(feature = "new_uninit", issue = "63291")]
733     #[inline]
734     pub unsafe fn assume_init(self) -> Arc<T> {
735         Arc::from_inner(mem::ManuallyDrop::new(self).ptr.cast())
736     }
737 }
738
739 impl<T> Arc<[mem::MaybeUninit<T>]> {
740     /// Converts to `Arc<[T]>`.
741     ///
742     /// # Safety
743     ///
744     /// As with [`MaybeUninit::assume_init`],
745     /// it is up to the caller to guarantee that the inner value
746     /// really is in an initialized state.
747     /// Calling this when the content is not yet fully initialized
748     /// causes immediate undefined behavior.
749     ///
750     /// [`MaybeUninit::assume_init`]: ../../std/mem/union.MaybeUninit.html#method.assume_init
751     ///
752     /// # Examples
753     ///
754     /// ```
755     /// #![feature(new_uninit)]
756     /// #![feature(get_mut_unchecked)]
757     ///
758     /// use std::sync::Arc;
759     ///
760     /// let mut values = Arc::<[u32]>::new_uninit_slice(3);
761     ///
762     /// let values = unsafe {
763     ///     // Deferred initialization:
764     ///     Arc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(1);
765     ///     Arc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(2);
766     ///     Arc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(3);
767     ///
768     ///     values.assume_init()
769     /// };
770     ///
771     /// assert_eq!(*values, [1, 2, 3])
772     /// ```
773     #[unstable(feature = "new_uninit", issue = "63291")]
774     #[inline]
775     pub unsafe fn assume_init(self) -> Arc<[T]> {
776         unsafe { Arc::from_ptr(mem::ManuallyDrop::new(self).ptr.as_ptr() as _) }
777     }
778 }
779
780 impl<T: ?Sized> Arc<T> {
781     /// Consumes the `Arc`, returning the wrapped pointer.
782     ///
783     /// To avoid a memory leak the pointer must be converted back to an `Arc` using
784     /// [`Arc::from_raw`].
785     ///
786     /// # Examples
787     ///
788     /// ```
789     /// use std::sync::Arc;
790     ///
791     /// let x = Arc::new("hello".to_owned());
792     /// let x_ptr = Arc::into_raw(x);
793     /// assert_eq!(unsafe { &*x_ptr }, "hello");
794     /// ```
795     #[stable(feature = "rc_raw", since = "1.17.0")]
796     pub fn into_raw(this: Self) -> *const T {
797         let ptr = Self::as_ptr(&this);
798         mem::forget(this);
799         ptr
800     }
801
802     /// Provides a raw pointer to the data.
803     ///
804     /// The counts are not affected in any way and the `Arc` is not consumed. The pointer is valid for
805     /// as long as there are strong counts in the `Arc`.
806     ///
807     /// # Examples
808     ///
809     /// ```
810     /// use std::sync::Arc;
811     ///
812     /// let x = Arc::new("hello".to_owned());
813     /// let y = Arc::clone(&x);
814     /// let x_ptr = Arc::as_ptr(&x);
815     /// assert_eq!(x_ptr, Arc::as_ptr(&y));
816     /// assert_eq!(unsafe { &*x_ptr }, "hello");
817     /// ```
818     #[stable(feature = "rc_as_ptr", since = "1.45.0")]
819     pub fn as_ptr(this: &Self) -> *const T {
820         let ptr: *mut ArcInner<T> = NonNull::as_ptr(this.ptr);
821
822         // SAFETY: This cannot go through Deref::deref or RcBoxPtr::inner because
823         // this is required to retain raw/mut provenance such that e.g. `get_mut` can
824         // write through the pointer after the Rc is recovered through `from_raw`.
825         unsafe { ptr::addr_of_mut!((*ptr).data) }
826     }
827
828     /// Constructs an `Arc<T>` from a raw pointer.
829     ///
830     /// The raw pointer must have been previously returned by a call to
831     /// [`Arc<U>::into_raw`][into_raw] where `U` must have the same size and
832     /// alignment as `T`. This is trivially true if `U` is `T`.
833     /// Note that if `U` is not `T` but has the same size and alignment, this is
834     /// basically like transmuting references of different types. See
835     /// [`mem::transmute`][transmute] for more information on what
836     /// restrictions apply in this case.
837     ///
838     /// The user of `from_raw` has to make sure a specific value of `T` is only
839     /// dropped once.
840     ///
841     /// This function is unsafe because improper use may lead to memory unsafety,
842     /// even if the returned `Arc<T>` is never accessed.
843     ///
844     /// [into_raw]: Arc::into_raw
845     /// [transmute]: core::mem::transmute
846     ///
847     /// # Examples
848     ///
849     /// ```
850     /// use std::sync::Arc;
851     ///
852     /// let x = Arc::new("hello".to_owned());
853     /// let x_ptr = Arc::into_raw(x);
854     ///
855     /// unsafe {
856     ///     // Convert back to an `Arc` to prevent leak.
857     ///     let x = Arc::from_raw(x_ptr);
858     ///     assert_eq!(&*x, "hello");
859     ///
860     ///     // Further calls to `Arc::from_raw(x_ptr)` would be memory-unsafe.
861     /// }
862     ///
863     /// // The memory was freed when `x` went out of scope above, so `x_ptr` is now dangling!
864     /// ```
865     #[stable(feature = "rc_raw", since = "1.17.0")]
866     pub unsafe fn from_raw(ptr: *const T) -> Self {
867         unsafe {
868             let offset = data_offset(ptr);
869
870             // Reverse the offset to find the original ArcInner.
871             let arc_ptr = (ptr as *mut ArcInner<T>).set_ptr_value((ptr as *mut u8).offset(-offset));
872
873             Self::from_ptr(arc_ptr)
874         }
875     }
876
877     /// Creates a new [`Weak`] pointer to this allocation.
878     ///
879     /// # Examples
880     ///
881     /// ```
882     /// use std::sync::Arc;
883     ///
884     /// let five = Arc::new(5);
885     ///
886     /// let weak_five = Arc::downgrade(&five);
887     /// ```
888     #[stable(feature = "arc_weak", since = "1.4.0")]
889     pub fn downgrade(this: &Self) -> Weak<T> {
890         // This Relaxed is OK because we're checking the value in the CAS
891         // below.
892         let mut cur = this.inner().weak.load(Relaxed);
893
894         loop {
895             // check if the weak counter is currently "locked"; if so, spin.
896             if cur == usize::MAX {
897                 hint::spin_loop();
898                 cur = this.inner().weak.load(Relaxed);
899                 continue;
900             }
901
902             // NOTE: this code currently ignores the possibility of overflow
903             // into usize::MAX; in general both Rc and Arc need to be adjusted
904             // to deal with overflow.
905
906             // Unlike with Clone(), we need this to be an Acquire read to
907             // synchronize with the write coming from `is_unique`, so that the
908             // events prior to that write happen before this read.
909             match this.inner().weak.compare_exchange_weak(cur, cur + 1, Acquire, Relaxed) {
910                 Ok(_) => {
911                     // Make sure we do not create a dangling Weak
912                     debug_assert!(!is_dangling(this.ptr.as_ptr()));
913                     return Weak { ptr: this.ptr };
914                 }
915                 Err(old) => cur = old,
916             }
917         }
918     }
919
920     /// Gets the number of [`Weak`] pointers to this allocation.
921     ///
922     /// # Safety
923     ///
924     /// This method by itself is safe, but using it correctly requires extra care.
925     /// Another thread can change the weak count at any time,
926     /// including potentially between calling this method and acting on the result.
927     ///
928     /// # Examples
929     ///
930     /// ```
931     /// use std::sync::Arc;
932     ///
933     /// let five = Arc::new(5);
934     /// let _weak_five = Arc::downgrade(&five);
935     ///
936     /// // This assertion is deterministic because we haven't shared
937     /// // the `Arc` or `Weak` between threads.
938     /// assert_eq!(1, Arc::weak_count(&five));
939     /// ```
940     #[inline]
941     #[stable(feature = "arc_counts", since = "1.15.0")]
942     pub fn weak_count(this: &Self) -> usize {
943         let cnt = this.inner().weak.load(SeqCst);
944         // If the weak count is currently locked, the value of the
945         // count was 0 just before taking the lock.
946         if cnt == usize::MAX { 0 } else { cnt - 1 }
947     }
948
949     /// Gets the number of strong (`Arc`) pointers to this allocation.
950     ///
951     /// # Safety
952     ///
953     /// This method by itself is safe, but using it correctly requires extra care.
954     /// Another thread can change the strong count at any time,
955     /// including potentially between calling this method and acting on the result.
956     ///
957     /// # Examples
958     ///
959     /// ```
960     /// use std::sync::Arc;
961     ///
962     /// let five = Arc::new(5);
963     /// let _also_five = Arc::clone(&five);
964     ///
965     /// // This assertion is deterministic because we haven't shared
966     /// // the `Arc` between threads.
967     /// assert_eq!(2, Arc::strong_count(&five));
968     /// ```
969     #[inline]
970     #[stable(feature = "arc_counts", since = "1.15.0")]
971     pub fn strong_count(this: &Self) -> usize {
972         this.inner().strong.load(SeqCst)
973     }
974
975     /// Increments the strong reference count on the `Arc<T>` associated with the
976     /// provided pointer by one.
977     ///
978     /// # Safety
979     ///
980     /// The pointer must have been obtained through `Arc::into_raw`, and the
981     /// associated `Arc` instance must be valid (i.e. the strong count must be at
982     /// least 1) for the duration of this method.
983     ///
984     /// # Examples
985     ///
986     /// ```
987     /// use std::sync::Arc;
988     ///
989     /// let five = Arc::new(5);
990     ///
991     /// unsafe {
992     ///     let ptr = Arc::into_raw(five);
993     ///     Arc::increment_strong_count(ptr);
994     ///
995     ///     // This assertion is deterministic because we haven't shared
996     ///     // the `Arc` between threads.
997     ///     let five = Arc::from_raw(ptr);
998     ///     assert_eq!(2, Arc::strong_count(&five));
999     /// }
1000     /// ```
1001     #[inline]
1002     #[stable(feature = "arc_mutate_strong_count", since = "1.51.0")]
1003     pub unsafe fn increment_strong_count(ptr: *const T) {
1004         // Retain Arc, but don't touch refcount by wrapping in ManuallyDrop
1005         let arc = unsafe { mem::ManuallyDrop::new(Arc::<T>::from_raw(ptr)) };
1006         // Now increase refcount, but don't drop new refcount either
1007         let _arc_clone: mem::ManuallyDrop<_> = arc.clone();
1008     }
1009
1010     /// Decrements the strong reference count on the `Arc<T>` associated with the
1011     /// provided pointer by one.
1012     ///
1013     /// # Safety
1014     ///
1015     /// The pointer must have been obtained through `Arc::into_raw`, and the
1016     /// associated `Arc` instance must be valid (i.e. the strong count must be at
1017     /// least 1) when invoking this method. This method can be used to release the final
1018     /// `Arc` and backing storage, but **should not** be called after the final `Arc` has been
1019     /// released.
1020     ///
1021     /// # Examples
1022     ///
1023     /// ```
1024     /// use std::sync::Arc;
1025     ///
1026     /// let five = Arc::new(5);
1027     ///
1028     /// unsafe {
1029     ///     let ptr = Arc::into_raw(five);
1030     ///     Arc::increment_strong_count(ptr);
1031     ///
1032     ///     // Those assertions are deterministic because we haven't shared
1033     ///     // the `Arc` between threads.
1034     ///     let five = Arc::from_raw(ptr);
1035     ///     assert_eq!(2, Arc::strong_count(&five));
1036     ///     Arc::decrement_strong_count(ptr);
1037     ///     assert_eq!(1, Arc::strong_count(&five));
1038     /// }
1039     /// ```
1040     #[inline]
1041     #[stable(feature = "arc_mutate_strong_count", since = "1.51.0")]
1042     pub unsafe fn decrement_strong_count(ptr: *const T) {
1043         unsafe { mem::drop(Arc::from_raw(ptr)) };
1044     }
1045
1046     #[inline]
1047     fn inner(&self) -> &ArcInner<T> {
1048         // This unsafety is ok because while this arc is alive we're guaranteed
1049         // that the inner pointer is valid. Furthermore, we know that the
1050         // `ArcInner` structure itself is `Sync` because the inner data is
1051         // `Sync` as well, so we're ok loaning out an immutable pointer to these
1052         // contents.
1053         unsafe { self.ptr.as_ref() }
1054     }
1055
1056     // Non-inlined part of `drop`.
1057     #[inline(never)]
1058     unsafe fn drop_slow(&mut self) {
1059         // Destroy the data at this time, even though we may not free the box
1060         // allocation itself (there may still be weak pointers lying around).
1061         unsafe { ptr::drop_in_place(Self::get_mut_unchecked(self)) };
1062
1063         // Drop the weak ref collectively held by all strong references
1064         drop(Weak { ptr: self.ptr });
1065     }
1066
1067     #[inline]
1068     #[stable(feature = "ptr_eq", since = "1.17.0")]
1069     /// Returns `true` if the two `Arc`s point to the same allocation
1070     /// (in a vein similar to [`ptr::eq`]).
1071     ///
1072     /// # Examples
1073     ///
1074     /// ```
1075     /// use std::sync::Arc;
1076     ///
1077     /// let five = Arc::new(5);
1078     /// let same_five = Arc::clone(&five);
1079     /// let other_five = Arc::new(5);
1080     ///
1081     /// assert!(Arc::ptr_eq(&five, &same_five));
1082     /// assert!(!Arc::ptr_eq(&five, &other_five));
1083     /// ```
1084     ///
1085     /// [`ptr::eq`]: core::ptr::eq
1086     pub fn ptr_eq(this: &Self, other: &Self) -> bool {
1087         this.ptr.as_ptr() == other.ptr.as_ptr()
1088     }
1089 }
1090
1091 impl<T: ?Sized> Arc<T> {
1092     /// Allocates an `ArcInner<T>` with sufficient space for
1093     /// a possibly-unsized inner value where the value has the layout provided.
1094     ///
1095     /// The function `mem_to_arcinner` is called with the data pointer
1096     /// and must return back a (potentially fat)-pointer for the `ArcInner<T>`.
1097     #[cfg(not(no_global_oom_handling))]
1098     unsafe fn allocate_for_layout(
1099         value_layout: Layout,
1100         allocate: impl FnOnce(Layout) -> Result<NonNull<[u8]>, AllocError>,
1101         mem_to_arcinner: impl FnOnce(*mut u8) -> *mut ArcInner<T>,
1102     ) -> *mut ArcInner<T> {
1103         // Calculate layout using the given value layout.
1104         // Previously, layout was calculated on the expression
1105         // `&*(ptr as *const ArcInner<T>)`, but this created a misaligned
1106         // reference (see #54908).
1107         let layout = Layout::new::<ArcInner<()>>().extend(value_layout).unwrap().0.pad_to_align();
1108         unsafe {
1109             Arc::try_allocate_for_layout(value_layout, allocate, mem_to_arcinner)
1110                 .unwrap_or_else(|_| handle_alloc_error(layout))
1111         }
1112     }
1113
1114     /// Allocates an `ArcInner<T>` with sufficient space for
1115     /// a possibly-unsized inner value where the value has the layout provided,
1116     /// returning an error if allocation fails.
1117     ///
1118     /// The function `mem_to_arcinner` is called with the data pointer
1119     /// and must return back a (potentially fat)-pointer for the `ArcInner<T>`.
1120     unsafe fn try_allocate_for_layout(
1121         value_layout: Layout,
1122         allocate: impl FnOnce(Layout) -> Result<NonNull<[u8]>, AllocError>,
1123         mem_to_arcinner: impl FnOnce(*mut u8) -> *mut ArcInner<T>,
1124     ) -> Result<*mut ArcInner<T>, AllocError> {
1125         // Calculate layout using the given value layout.
1126         // Previously, layout was calculated on the expression
1127         // `&*(ptr as *const ArcInner<T>)`, but this created a misaligned
1128         // reference (see #54908).
1129         let layout = Layout::new::<ArcInner<()>>().extend(value_layout).unwrap().0.pad_to_align();
1130
1131         let ptr = allocate(layout)?;
1132
1133         // Initialize the ArcInner
1134         let inner = mem_to_arcinner(ptr.as_non_null_ptr().as_ptr());
1135         debug_assert_eq!(unsafe { Layout::for_value(&*inner) }, layout);
1136
1137         unsafe {
1138             ptr::write(&mut (*inner).strong, atomic::AtomicUsize::new(1));
1139             ptr::write(&mut (*inner).weak, atomic::AtomicUsize::new(1));
1140         }
1141
1142         Ok(inner)
1143     }
1144
1145     /// Allocates an `ArcInner<T>` with sufficient space for an unsized inner value.
1146     #[cfg(not(no_global_oom_handling))]
1147     unsafe fn allocate_for_ptr(ptr: *const T) -> *mut ArcInner<T> {
1148         // Allocate for the `ArcInner<T>` using the given value.
1149         unsafe {
1150             Self::allocate_for_layout(
1151                 Layout::for_value(&*ptr),
1152                 |layout| Global.allocate(layout),
1153                 |mem| (ptr as *mut ArcInner<T>).set_ptr_value(mem) as *mut ArcInner<T>,
1154             )
1155         }
1156     }
1157
1158     #[cfg(not(no_global_oom_handling))]
1159     fn from_box(v: Box<T>) -> Arc<T> {
1160         unsafe {
1161             let (box_unique, alloc) = Box::into_unique(v);
1162             let bptr = box_unique.as_ptr();
1163
1164             let value_size = size_of_val(&*bptr);
1165             let ptr = Self::allocate_for_ptr(bptr);
1166
1167             // Copy value as bytes
1168             ptr::copy_nonoverlapping(
1169                 bptr as *const T as *const u8,
1170                 &mut (*ptr).data as *mut _ as *mut u8,
1171                 value_size,
1172             );
1173
1174             // Free the allocation without dropping its contents
1175             box_free(box_unique, alloc);
1176
1177             Self::from_ptr(ptr)
1178         }
1179     }
1180 }
1181
1182 impl<T> Arc<[T]> {
1183     /// Allocates an `ArcInner<[T]>` with the given length.
1184     #[cfg(not(no_global_oom_handling))]
1185     unsafe fn allocate_for_slice(len: usize) -> *mut ArcInner<[T]> {
1186         unsafe {
1187             Self::allocate_for_layout(
1188                 Layout::array::<T>(len).unwrap(),
1189                 |layout| Global.allocate(layout),
1190                 |mem| ptr::slice_from_raw_parts_mut(mem as *mut T, len) as *mut ArcInner<[T]>,
1191             )
1192         }
1193     }
1194
1195     /// Copy elements from slice into newly allocated Arc<\[T\]>
1196     ///
1197     /// Unsafe because the caller must either take ownership or bind `T: Copy`.
1198     #[cfg(not(no_global_oom_handling))]
1199     unsafe fn copy_from_slice(v: &[T]) -> Arc<[T]> {
1200         unsafe {
1201             let ptr = Self::allocate_for_slice(v.len());
1202
1203             ptr::copy_nonoverlapping(v.as_ptr(), &mut (*ptr).data as *mut [T] as *mut T, v.len());
1204
1205             Self::from_ptr(ptr)
1206         }
1207     }
1208
1209     /// Constructs an `Arc<[T]>` from an iterator known to be of a certain size.
1210     ///
1211     /// Behavior is undefined should the size be wrong.
1212     #[cfg(not(no_global_oom_handling))]
1213     unsafe fn from_iter_exact(iter: impl iter::Iterator<Item = T>, len: usize) -> Arc<[T]> {
1214         // Panic guard while cloning T elements.
1215         // In the event of a panic, elements that have been written
1216         // into the new ArcInner will be dropped, then the memory freed.
1217         struct Guard<T> {
1218             mem: NonNull<u8>,
1219             elems: *mut T,
1220             layout: Layout,
1221             n_elems: usize,
1222         }
1223
1224         impl<T> Drop for Guard<T> {
1225             fn drop(&mut self) {
1226                 unsafe {
1227                     let slice = from_raw_parts_mut(self.elems, self.n_elems);
1228                     ptr::drop_in_place(slice);
1229
1230                     Global.deallocate(self.mem, self.layout);
1231                 }
1232             }
1233         }
1234
1235         unsafe {
1236             let ptr = Self::allocate_for_slice(len);
1237
1238             let mem = ptr as *mut _ as *mut u8;
1239             let layout = Layout::for_value(&*ptr);
1240
1241             // Pointer to first element
1242             let elems = &mut (*ptr).data as *mut [T] as *mut T;
1243
1244             let mut guard = Guard { mem: NonNull::new_unchecked(mem), elems, layout, n_elems: 0 };
1245
1246             for (i, item) in iter.enumerate() {
1247                 ptr::write(elems.add(i), item);
1248                 guard.n_elems += 1;
1249             }
1250
1251             // All clear. Forget the guard so it doesn't free the new ArcInner.
1252             mem::forget(guard);
1253
1254             Self::from_ptr(ptr)
1255         }
1256     }
1257 }
1258
1259 /// Specialization trait used for `From<&[T]>`.
1260 #[cfg(not(no_global_oom_handling))]
1261 trait ArcFromSlice<T> {
1262     fn from_slice(slice: &[T]) -> Self;
1263 }
1264
1265 #[cfg(not(no_global_oom_handling))]
1266 impl<T: Clone> ArcFromSlice<T> for Arc<[T]> {
1267     #[inline]
1268     default fn from_slice(v: &[T]) -> Self {
1269         unsafe { Self::from_iter_exact(v.iter().cloned(), v.len()) }
1270     }
1271 }
1272
1273 #[cfg(not(no_global_oom_handling))]
1274 impl<T: Copy> ArcFromSlice<T> for Arc<[T]> {
1275     #[inline]
1276     fn from_slice(v: &[T]) -> Self {
1277         unsafe { Arc::copy_from_slice(v) }
1278     }
1279 }
1280
1281 #[stable(feature = "rust1", since = "1.0.0")]
1282 impl<T: ?Sized> Clone for Arc<T> {
1283     /// Makes a clone of the `Arc` pointer.
1284     ///
1285     /// This creates another pointer to the same allocation, increasing the
1286     /// strong reference count.
1287     ///
1288     /// # Examples
1289     ///
1290     /// ```
1291     /// use std::sync::Arc;
1292     ///
1293     /// let five = Arc::new(5);
1294     ///
1295     /// let _ = Arc::clone(&five);
1296     /// ```
1297     #[inline]
1298     fn clone(&self) -> Arc<T> {
1299         // Using a relaxed ordering is alright here, as knowledge of the
1300         // original reference prevents other threads from erroneously deleting
1301         // the object.
1302         //
1303         // As explained in the [Boost documentation][1], Increasing the
1304         // reference counter can always be done with memory_order_relaxed: New
1305         // references to an object can only be formed from an existing
1306         // reference, and passing an existing reference from one thread to
1307         // another must already provide any required synchronization.
1308         //
1309         // [1]: (www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html)
1310         let old_size = self.inner().strong.fetch_add(1, Relaxed);
1311
1312         // However we need to guard against massive refcounts in case someone
1313         // is `mem::forget`ing Arcs. If we don't do this the count can overflow
1314         // and users will use-after free. We racily saturate to `isize::MAX` on
1315         // the assumption that there aren't ~2 billion threads incrementing
1316         // the reference count at once. This branch will never be taken in
1317         // any realistic program.
1318         //
1319         // We abort because such a program is incredibly degenerate, and we
1320         // don't care to support it.
1321         if old_size > MAX_REFCOUNT {
1322             abort();
1323         }
1324
1325         Self::from_inner(self.ptr)
1326     }
1327 }
1328
1329 #[stable(feature = "rust1", since = "1.0.0")]
1330 impl<T: ?Sized> Deref for Arc<T> {
1331     type Target = T;
1332
1333     #[inline]
1334     fn deref(&self) -> &T {
1335         &self.inner().data
1336     }
1337 }
1338
1339 #[unstable(feature = "receiver_trait", issue = "none")]
1340 impl<T: ?Sized> Receiver for Arc<T> {}
1341
1342 impl<T: Clone> Arc<T> {
1343     /// Makes a mutable reference into the given `Arc`.
1344     ///
1345     /// If there are other `Arc` or [`Weak`] pointers to the same allocation,
1346     /// then `make_mut` will create a new allocation and invoke [`clone`][clone] on the inner value
1347     /// to ensure unique ownership. This is also referred to as clone-on-write.
1348     ///
1349     /// Note that this differs from the behavior of [`Rc::make_mut`] which disassociates
1350     /// any remaining `Weak` pointers.
1351     ///
1352     /// See also [`get_mut`][get_mut], which will fail rather than cloning.
1353     ///
1354     /// [clone]: Clone::clone
1355     /// [get_mut]: Arc::get_mut
1356     /// [`Rc::make_mut`]: super::rc::Rc::make_mut
1357     ///
1358     /// # Examples
1359     ///
1360     /// ```
1361     /// use std::sync::Arc;
1362     ///
1363     /// let mut data = Arc::new(5);
1364     ///
1365     /// *Arc::make_mut(&mut data) += 1;         // Won't clone anything
1366     /// let mut other_data = Arc::clone(&data); // Won't clone inner data
1367     /// *Arc::make_mut(&mut data) += 1;         // Clones inner data
1368     /// *Arc::make_mut(&mut data) += 1;         // Won't clone anything
1369     /// *Arc::make_mut(&mut other_data) *= 2;   // Won't clone anything
1370     ///
1371     /// // Now `data` and `other_data` point to different allocations.
1372     /// assert_eq!(*data, 8);
1373     /// assert_eq!(*other_data, 12);
1374     /// ```
1375     #[cfg(not(no_global_oom_handling))]
1376     #[inline]
1377     #[stable(feature = "arc_unique", since = "1.4.0")]
1378     pub fn make_mut(this: &mut Self) -> &mut T {
1379         // Note that we hold both a strong reference and a weak reference.
1380         // Thus, releasing our strong reference only will not, by itself, cause
1381         // the memory to be deallocated.
1382         //
1383         // Use Acquire to ensure that we see any writes to `weak` that happen
1384         // before release writes (i.e., decrements) to `strong`. Since we hold a
1385         // weak count, there's no chance the ArcInner itself could be
1386         // deallocated.
1387         if this.inner().strong.compare_exchange(1, 0, Acquire, Relaxed).is_err() {
1388             // Another strong pointer exists, so we must clone.
1389             // Pre-allocate memory to allow writing the cloned value directly.
1390             let mut arc = Self::new_uninit();
1391             unsafe {
1392                 let data = Arc::get_mut_unchecked(&mut arc);
1393                 (**this).write_clone_into_raw(data.as_mut_ptr());
1394                 *this = arc.assume_init();
1395             }
1396         } else if this.inner().weak.load(Relaxed) != 1 {
1397             // Relaxed suffices in the above because this is fundamentally an
1398             // optimization: we are always racing with weak pointers being
1399             // dropped. Worst case, we end up allocated a new Arc unnecessarily.
1400
1401             // We removed the last strong ref, but there are additional weak
1402             // refs remaining. We'll move the contents to a new Arc, and
1403             // invalidate the other weak refs.
1404
1405             // Note that it is not possible for the read of `weak` to yield
1406             // usize::MAX (i.e., locked), since the weak count can only be
1407             // locked by a thread with a strong reference.
1408
1409             // Materialize our own implicit weak pointer, so that it can clean
1410             // up the ArcInner as needed.
1411             let _weak = Weak { ptr: this.ptr };
1412
1413             // Can just steal the data, all that's left is Weaks
1414             let mut arc = Self::new_uninit();
1415             unsafe {
1416                 let data = Arc::get_mut_unchecked(&mut arc);
1417                 data.as_mut_ptr().copy_from_nonoverlapping(&**this, 1);
1418                 ptr::write(this, arc.assume_init());
1419             }
1420         } else {
1421             // We were the sole reference of either kind; bump back up the
1422             // strong ref count.
1423             this.inner().strong.store(1, Release);
1424         }
1425
1426         // As with `get_mut()`, the unsafety is ok because our reference was
1427         // either unique to begin with, or became one upon cloning the contents.
1428         unsafe { Self::get_mut_unchecked(this) }
1429     }
1430 }
1431
1432 impl<T: ?Sized> Arc<T> {
1433     /// Returns a mutable reference into the given `Arc`, if there are
1434     /// no other `Arc` or [`Weak`] pointers to the same allocation.
1435     ///
1436     /// Returns [`None`] otherwise, because it is not safe to
1437     /// mutate a shared value.
1438     ///
1439     /// See also [`make_mut`][make_mut], which will [`clone`][clone]
1440     /// the inner value when there are other pointers.
1441     ///
1442     /// [make_mut]: Arc::make_mut
1443     /// [clone]: Clone::clone
1444     ///
1445     /// # Examples
1446     ///
1447     /// ```
1448     /// use std::sync::Arc;
1449     ///
1450     /// let mut x = Arc::new(3);
1451     /// *Arc::get_mut(&mut x).unwrap() = 4;
1452     /// assert_eq!(*x, 4);
1453     ///
1454     /// let _y = Arc::clone(&x);
1455     /// assert!(Arc::get_mut(&mut x).is_none());
1456     /// ```
1457     #[inline]
1458     #[stable(feature = "arc_unique", since = "1.4.0")]
1459     pub fn get_mut(this: &mut Self) -> Option<&mut T> {
1460         if this.is_unique() {
1461             // This unsafety is ok because we're guaranteed that the pointer
1462             // returned is the *only* pointer that will ever be returned to T. Our
1463             // reference count is guaranteed to be 1 at this point, and we required
1464             // the Arc itself to be `mut`, so we're returning the only possible
1465             // reference to the inner data.
1466             unsafe { Some(Arc::get_mut_unchecked(this)) }
1467         } else {
1468             None
1469         }
1470     }
1471
1472     /// Returns a mutable reference into the given `Arc`,
1473     /// without any check.
1474     ///
1475     /// See also [`get_mut`], which is safe and does appropriate checks.
1476     ///
1477     /// [`get_mut`]: Arc::get_mut
1478     ///
1479     /// # Safety
1480     ///
1481     /// Any other `Arc` or [`Weak`] pointers to the same allocation must not be dereferenced
1482     /// for the duration of the returned borrow.
1483     /// This is trivially the case if no such pointers exist,
1484     /// for example immediately after `Arc::new`.
1485     ///
1486     /// # Examples
1487     ///
1488     /// ```
1489     /// #![feature(get_mut_unchecked)]
1490     ///
1491     /// use std::sync::Arc;
1492     ///
1493     /// let mut x = Arc::new(String::new());
1494     /// unsafe {
1495     ///     Arc::get_mut_unchecked(&mut x).push_str("foo")
1496     /// }
1497     /// assert_eq!(*x, "foo");
1498     /// ```
1499     #[inline]
1500     #[unstable(feature = "get_mut_unchecked", issue = "63292")]
1501     pub unsafe fn get_mut_unchecked(this: &mut Self) -> &mut T {
1502         // We are careful to *not* create a reference covering the "count" fields, as
1503         // this would alias with concurrent access to the reference counts (e.g. by `Weak`).
1504         unsafe { &mut (*this.ptr.as_ptr()).data }
1505     }
1506
1507     /// Determine whether this is the unique reference (including weak refs) to
1508     /// the underlying data.
1509     ///
1510     /// Note that this requires locking the weak ref count.
1511     fn is_unique(&mut self) -> bool {
1512         // lock the weak pointer count if we appear to be the sole weak pointer
1513         // holder.
1514         //
1515         // The acquire label here ensures a happens-before relationship with any
1516         // writes to `strong` (in particular in `Weak::upgrade`) prior to decrements
1517         // of the `weak` count (via `Weak::drop`, which uses release).  If the upgraded
1518         // weak ref was never dropped, the CAS here will fail so we do not care to synchronize.
1519         if self.inner().weak.compare_exchange(1, usize::MAX, Acquire, Relaxed).is_ok() {
1520             // This needs to be an `Acquire` to synchronize with the decrement of the `strong`
1521             // counter in `drop` -- the only access that happens when any but the last reference
1522             // is being dropped.
1523             let unique = self.inner().strong.load(Acquire) == 1;
1524
1525             // The release write here synchronizes with a read in `downgrade`,
1526             // effectively preventing the above read of `strong` from happening
1527             // after the write.
1528             self.inner().weak.store(1, Release); // release the lock
1529             unique
1530         } else {
1531             false
1532         }
1533     }
1534 }
1535
1536 #[stable(feature = "rust1", since = "1.0.0")]
1537 unsafe impl<#[may_dangle] T: ?Sized> Drop for Arc<T> {
1538     /// Drops the `Arc`.
1539     ///
1540     /// This will decrement the strong reference count. If the strong reference
1541     /// count reaches zero then the only other references (if any) are
1542     /// [`Weak`], so we `drop` the inner value.
1543     ///
1544     /// # Examples
1545     ///
1546     /// ```
1547     /// use std::sync::Arc;
1548     ///
1549     /// struct Foo;
1550     ///
1551     /// impl Drop for Foo {
1552     ///     fn drop(&mut self) {
1553     ///         println!("dropped!");
1554     ///     }
1555     /// }
1556     ///
1557     /// let foo  = Arc::new(Foo);
1558     /// let foo2 = Arc::clone(&foo);
1559     ///
1560     /// drop(foo);    // Doesn't print anything
1561     /// drop(foo2);   // Prints "dropped!"
1562     /// ```
1563     #[inline]
1564     fn drop(&mut self) {
1565         // Because `fetch_sub` is already atomic, we do not need to synchronize
1566         // with other threads unless we are going to delete the object. This
1567         // same logic applies to the below `fetch_sub` to the `weak` count.
1568         if self.inner().strong.fetch_sub(1, Release) != 1 {
1569             return;
1570         }
1571
1572         // This fence is needed to prevent reordering of use of the data and
1573         // deletion of the data.  Because it is marked `Release`, the decreasing
1574         // of the reference count synchronizes with this `Acquire` fence. This
1575         // means that use of the data happens before decreasing the reference
1576         // count, which happens before this fence, which happens before the
1577         // deletion of the data.
1578         //
1579         // As explained in the [Boost documentation][1],
1580         //
1581         // > It is important to enforce any possible access to the object in one
1582         // > thread (through an existing reference) to *happen before* deleting
1583         // > the object in a different thread. This is achieved by a "release"
1584         // > operation after dropping a reference (any access to the object
1585         // > through this reference must obviously happened before), and an
1586         // > "acquire" operation before deleting the object.
1587         //
1588         // In particular, while the contents of an Arc are usually immutable, it's
1589         // possible to have interior writes to something like a Mutex<T>. Since a
1590         // Mutex is not acquired when it is deleted, we can't rely on its
1591         // synchronization logic to make writes in thread A visible to a destructor
1592         // running in thread B.
1593         //
1594         // Also note that the Acquire fence here could probably be replaced with an
1595         // Acquire load, which could improve performance in highly-contended
1596         // situations. See [2].
1597         //
1598         // [1]: (www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html)
1599         // [2]: (https://github.com/rust-lang/rust/pull/41714)
1600         acquire!(self.inner().strong);
1601
1602         unsafe {
1603             self.drop_slow();
1604         }
1605     }
1606 }
1607
1608 impl Arc<dyn Any + Send + Sync> {
1609     #[inline]
1610     #[stable(feature = "rc_downcast", since = "1.29.0")]
1611     /// Attempt to downcast the `Arc<dyn Any + Send + Sync>` to a concrete type.
1612     ///
1613     /// # Examples
1614     ///
1615     /// ```
1616     /// use std::any::Any;
1617     /// use std::sync::Arc;
1618     ///
1619     /// fn print_if_string(value: Arc<dyn Any + Send + Sync>) {
1620     ///     if let Ok(string) = value.downcast::<String>() {
1621     ///         println!("String ({}): {}", string.len(), string);
1622     ///     }
1623     /// }
1624     ///
1625     /// let my_string = "Hello World".to_string();
1626     /// print_if_string(Arc::new(my_string));
1627     /// print_if_string(Arc::new(0i8));
1628     /// ```
1629     pub fn downcast<T>(self) -> Result<Arc<T>, Self>
1630     where
1631         T: Any + Send + Sync + 'static,
1632     {
1633         if (*self).is::<T>() {
1634             let ptr = self.ptr.cast::<ArcInner<T>>();
1635             mem::forget(self);
1636             Ok(Arc::from_inner(ptr))
1637         } else {
1638             Err(self)
1639         }
1640     }
1641 }
1642
1643 impl<T> Weak<T> {
1644     /// Constructs a new `Weak<T>`, without allocating any memory.
1645     /// Calling [`upgrade`] on the return value always gives [`None`].
1646     ///
1647     /// [`upgrade`]: Weak::upgrade
1648     ///
1649     /// # Examples
1650     ///
1651     /// ```
1652     /// use std::sync::Weak;
1653     ///
1654     /// let empty: Weak<i64> = Weak::new();
1655     /// assert!(empty.upgrade().is_none());
1656     /// ```
1657     #[stable(feature = "downgraded_weak", since = "1.10.0")]
1658     pub fn new() -> Weak<T> {
1659         Weak { ptr: NonNull::new(usize::MAX as *mut ArcInner<T>).expect("MAX is not 0") }
1660     }
1661 }
1662
1663 /// Helper type to allow accessing the reference counts without
1664 /// making any assertions about the data field.
1665 struct WeakInner<'a> {
1666     weak: &'a atomic::AtomicUsize,
1667     strong: &'a atomic::AtomicUsize,
1668 }
1669
1670 impl<T: ?Sized> Weak<T> {
1671     /// Returns a raw pointer to the object `T` pointed to by this `Weak<T>`.
1672     ///
1673     /// The pointer is valid only if there are some strong references. The pointer may be dangling,
1674     /// unaligned or even [`null`] otherwise.
1675     ///
1676     /// # Examples
1677     ///
1678     /// ```
1679     /// use std::sync::Arc;
1680     /// use std::ptr;
1681     ///
1682     /// let strong = Arc::new("hello".to_owned());
1683     /// let weak = Arc::downgrade(&strong);
1684     /// // Both point to the same object
1685     /// assert!(ptr::eq(&*strong, weak.as_ptr()));
1686     /// // The strong here keeps it alive, so we can still access the object.
1687     /// assert_eq!("hello", unsafe { &*weak.as_ptr() });
1688     ///
1689     /// drop(strong);
1690     /// // But not any more. We can do weak.as_ptr(), but accessing the pointer would lead to
1691     /// // undefined behaviour.
1692     /// // assert_eq!("hello", unsafe { &*weak.as_ptr() });
1693     /// ```
1694     ///
1695     /// [`null`]: core::ptr::null
1696     #[stable(feature = "weak_into_raw", since = "1.45.0")]
1697     pub fn as_ptr(&self) -> *const T {
1698         let ptr: *mut ArcInner<T> = NonNull::as_ptr(self.ptr);
1699
1700         if is_dangling(ptr) {
1701             // If the pointer is dangling, we return the sentinel directly. This cannot be
1702             // a valid payload address, as the payload is at least as aligned as ArcInner (usize).
1703             ptr as *const T
1704         } else {
1705             // SAFETY: if is_dangling returns false, then the pointer is dereferencable.
1706             // The payload may be dropped at this point, and we have to maintain provenance,
1707             // so use raw pointer manipulation.
1708             unsafe { ptr::addr_of_mut!((*ptr).data) }
1709         }
1710     }
1711
1712     /// Consumes the `Weak<T>` and turns it into a raw pointer.
1713     ///
1714     /// This converts the weak pointer into a raw pointer, while still preserving the ownership of
1715     /// one weak reference (the weak count is not modified by this operation). It can be turned
1716     /// back into the `Weak<T>` with [`from_raw`].
1717     ///
1718     /// The same restrictions of accessing the target of the pointer as with
1719     /// [`as_ptr`] apply.
1720     ///
1721     /// # Examples
1722     ///
1723     /// ```
1724     /// use std::sync::{Arc, Weak};
1725     ///
1726     /// let strong = Arc::new("hello".to_owned());
1727     /// let weak = Arc::downgrade(&strong);
1728     /// let raw = weak.into_raw();
1729     ///
1730     /// assert_eq!(1, Arc::weak_count(&strong));
1731     /// assert_eq!("hello", unsafe { &*raw });
1732     ///
1733     /// drop(unsafe { Weak::from_raw(raw) });
1734     /// assert_eq!(0, Arc::weak_count(&strong));
1735     /// ```
1736     ///
1737     /// [`from_raw`]: Weak::from_raw
1738     /// [`as_ptr`]: Weak::as_ptr
1739     #[stable(feature = "weak_into_raw", since = "1.45.0")]
1740     pub fn into_raw(self) -> *const T {
1741         let result = self.as_ptr();
1742         mem::forget(self);
1743         result
1744     }
1745
1746     /// Converts a raw pointer previously created by [`into_raw`] back into `Weak<T>`.
1747     ///
1748     /// This can be used to safely get a strong reference (by calling [`upgrade`]
1749     /// later) or to deallocate the weak count by dropping the `Weak<T>`.
1750     ///
1751     /// It takes ownership of one weak reference (with the exception of pointers created by [`new`],
1752     /// as these don't own anything; the method still works on them).
1753     ///
1754     /// # Safety
1755     ///
1756     /// The pointer must have originated from the [`into_raw`] and must still own its potential
1757     /// weak reference.
1758     ///
1759     /// It is allowed for the strong count to be 0 at the time of calling this. Nevertheless, this
1760     /// takes ownership of one weak reference currently represented as a raw pointer (the weak
1761     /// count is not modified by this operation) and therefore it must be paired with a previous
1762     /// call to [`into_raw`].
1763     /// # Examples
1764     ///
1765     /// ```
1766     /// use std::sync::{Arc, Weak};
1767     ///
1768     /// let strong = Arc::new("hello".to_owned());
1769     ///
1770     /// let raw_1 = Arc::downgrade(&strong).into_raw();
1771     /// let raw_2 = Arc::downgrade(&strong).into_raw();
1772     ///
1773     /// assert_eq!(2, Arc::weak_count(&strong));
1774     ///
1775     /// assert_eq!("hello", &*unsafe { Weak::from_raw(raw_1) }.upgrade().unwrap());
1776     /// assert_eq!(1, Arc::weak_count(&strong));
1777     ///
1778     /// drop(strong);
1779     ///
1780     /// // Decrement the last weak count.
1781     /// assert!(unsafe { Weak::from_raw(raw_2) }.upgrade().is_none());
1782     /// ```
1783     ///
1784     /// [`new`]: Weak::new
1785     /// [`into_raw`]: Weak::into_raw
1786     /// [`upgrade`]: Weak::upgrade
1787     /// [`forget`]: std::mem::forget
1788     #[stable(feature = "weak_into_raw", since = "1.45.0")]
1789     pub unsafe fn from_raw(ptr: *const T) -> Self {
1790         // See Weak::as_ptr for context on how the input pointer is derived.
1791
1792         let ptr = if is_dangling(ptr as *mut T) {
1793             // This is a dangling Weak.
1794             ptr as *mut ArcInner<T>
1795         } else {
1796             // Otherwise, we're guaranteed the pointer came from a nondangling Weak.
1797             // SAFETY: data_offset is safe to call, as ptr references a real (potentially dropped) T.
1798             let offset = unsafe { data_offset(ptr) };
1799             // Thus, we reverse the offset to get the whole RcBox.
1800             // SAFETY: the pointer originated from a Weak, so this offset is safe.
1801             unsafe { (ptr as *mut ArcInner<T>).set_ptr_value((ptr as *mut u8).offset(-offset)) }
1802         };
1803
1804         // SAFETY: we now have recovered the original Weak pointer, so can create the Weak.
1805         Weak { ptr: unsafe { NonNull::new_unchecked(ptr) } }
1806     }
1807 }
1808
1809 impl<T: ?Sized> Weak<T> {
1810     /// Attempts to upgrade the `Weak` pointer to an [`Arc`], delaying
1811     /// dropping of the inner value if successful.
1812     ///
1813     /// Returns [`None`] if the inner value has since been dropped.
1814     ///
1815     /// # Examples
1816     ///
1817     /// ```
1818     /// use std::sync::Arc;
1819     ///
1820     /// let five = Arc::new(5);
1821     ///
1822     /// let weak_five = Arc::downgrade(&five);
1823     ///
1824     /// let strong_five: Option<Arc<_>> = weak_five.upgrade();
1825     /// assert!(strong_five.is_some());
1826     ///
1827     /// // Destroy all strong pointers.
1828     /// drop(strong_five);
1829     /// drop(five);
1830     ///
1831     /// assert!(weak_five.upgrade().is_none());
1832     /// ```
1833     #[stable(feature = "arc_weak", since = "1.4.0")]
1834     pub fn upgrade(&self) -> Option<Arc<T>> {
1835         // We use a CAS loop to increment the strong count instead of a
1836         // fetch_add as this function should never take the reference count
1837         // from zero to one.
1838         let inner = self.inner()?;
1839
1840         // Relaxed load because any write of 0 that we can observe
1841         // leaves the field in a permanently zero state (so a
1842         // "stale" read of 0 is fine), and any other value is
1843         // confirmed via the CAS below.
1844         let mut n = inner.strong.load(Relaxed);
1845
1846         loop {
1847             if n == 0 {
1848                 return None;
1849             }
1850
1851             // See comments in `Arc::clone` for why we do this (for `mem::forget`).
1852             if n > MAX_REFCOUNT {
1853                 abort();
1854             }
1855
1856             // Relaxed is fine for the failure case because we don't have any expectations about the new state.
1857             // Acquire is necessary for the success case to synchronise with `Arc::new_cyclic`, when the inner
1858             // value can be initialized after `Weak` references have already been created. In that case, we
1859             // expect to observe the fully initialized value.
1860             match inner.strong.compare_exchange_weak(n, n + 1, Acquire, Relaxed) {
1861                 Ok(_) => return Some(Arc::from_inner(self.ptr)), // null checked above
1862                 Err(old) => n = old,
1863             }
1864         }
1865     }
1866
1867     /// Gets the number of strong (`Arc`) pointers pointing to this allocation.
1868     ///
1869     /// If `self` was created using [`Weak::new`], this will return 0.
1870     #[stable(feature = "weak_counts", since = "1.41.0")]
1871     pub fn strong_count(&self) -> usize {
1872         if let Some(inner) = self.inner() { inner.strong.load(SeqCst) } else { 0 }
1873     }
1874
1875     /// Gets an approximation of the number of `Weak` pointers pointing to this
1876     /// allocation.
1877     ///
1878     /// If `self` was created using [`Weak::new`], or if there are no remaining
1879     /// strong pointers, this will return 0.
1880     ///
1881     /// # Accuracy
1882     ///
1883     /// Due to implementation details, the returned value can be off by 1 in
1884     /// either direction when other threads are manipulating any `Arc`s or
1885     /// `Weak`s pointing to the same allocation.
1886     #[stable(feature = "weak_counts", since = "1.41.0")]
1887     pub fn weak_count(&self) -> usize {
1888         self.inner()
1889             .map(|inner| {
1890                 let weak = inner.weak.load(SeqCst);
1891                 let strong = inner.strong.load(SeqCst);
1892                 if strong == 0 {
1893                     0
1894                 } else {
1895                     // Since we observed that there was at least one strong pointer
1896                     // after reading the weak count, we know that the implicit weak
1897                     // reference (present whenever any strong references are alive)
1898                     // was still around when we observed the weak count, and can
1899                     // therefore safely subtract it.
1900                     weak - 1
1901                 }
1902             })
1903             .unwrap_or(0)
1904     }
1905
1906     /// Returns `None` when the pointer is dangling and there is no allocated `ArcInner`,
1907     /// (i.e., when this `Weak` was created by `Weak::new`).
1908     #[inline]
1909     fn inner(&self) -> Option<WeakInner<'_>> {
1910         if is_dangling(self.ptr.as_ptr()) {
1911             None
1912         } else {
1913             // We are careful to *not* create a reference covering the "data" field, as
1914             // the field may be mutated concurrently (for example, if the last `Arc`
1915             // is dropped, the data field will be dropped in-place).
1916             Some(unsafe {
1917                 let ptr = self.ptr.as_ptr();
1918                 WeakInner { strong: &(*ptr).strong, weak: &(*ptr).weak }
1919             })
1920         }
1921     }
1922
1923     /// Returns `true` if the two `Weak`s point to the same allocation (similar to
1924     /// [`ptr::eq`]), or if both don't point to any allocation
1925     /// (because they were created with `Weak::new()`).
1926     ///
1927     /// # Notes
1928     ///
1929     /// Since this compares pointers it means that `Weak::new()` will equal each
1930     /// other, even though they don't point to any allocation.
1931     ///
1932     /// # Examples
1933     ///
1934     /// ```
1935     /// use std::sync::Arc;
1936     ///
1937     /// let first_rc = Arc::new(5);
1938     /// let first = Arc::downgrade(&first_rc);
1939     /// let second = Arc::downgrade(&first_rc);
1940     ///
1941     /// assert!(first.ptr_eq(&second));
1942     ///
1943     /// let third_rc = Arc::new(5);
1944     /// let third = Arc::downgrade(&third_rc);
1945     ///
1946     /// assert!(!first.ptr_eq(&third));
1947     /// ```
1948     ///
1949     /// Comparing `Weak::new`.
1950     ///
1951     /// ```
1952     /// use std::sync::{Arc, Weak};
1953     ///
1954     /// let first = Weak::new();
1955     /// let second = Weak::new();
1956     /// assert!(first.ptr_eq(&second));
1957     ///
1958     /// let third_rc = Arc::new(());
1959     /// let third = Arc::downgrade(&third_rc);
1960     /// assert!(!first.ptr_eq(&third));
1961     /// ```
1962     ///
1963     /// [`ptr::eq`]: core::ptr::eq
1964     #[inline]
1965     #[stable(feature = "weak_ptr_eq", since = "1.39.0")]
1966     pub fn ptr_eq(&self, other: &Self) -> bool {
1967         self.ptr.as_ptr() == other.ptr.as_ptr()
1968     }
1969 }
1970
1971 #[stable(feature = "arc_weak", since = "1.4.0")]
1972 impl<T: ?Sized> Clone for Weak<T> {
1973     /// Makes a clone of the `Weak` pointer that points to the same allocation.
1974     ///
1975     /// # Examples
1976     ///
1977     /// ```
1978     /// use std::sync::{Arc, Weak};
1979     ///
1980     /// let weak_five = Arc::downgrade(&Arc::new(5));
1981     ///
1982     /// let _ = Weak::clone(&weak_five);
1983     /// ```
1984     #[inline]
1985     fn clone(&self) -> Weak<T> {
1986         let inner = if let Some(inner) = self.inner() {
1987             inner
1988         } else {
1989             return Weak { ptr: self.ptr };
1990         };
1991         // See comments in Arc::clone() for why this is relaxed.  This can use a
1992         // fetch_add (ignoring the lock) because the weak count is only locked
1993         // where are *no other* weak pointers in existence. (So we can't be
1994         // running this code in that case).
1995         let old_size = inner.weak.fetch_add(1, Relaxed);
1996
1997         // See comments in Arc::clone() for why we do this (for mem::forget).
1998         if old_size > MAX_REFCOUNT {
1999             abort();
2000         }
2001
2002         Weak { ptr: self.ptr }
2003     }
2004 }
2005
2006 #[stable(feature = "downgraded_weak", since = "1.10.0")]
2007 impl<T> Default for Weak<T> {
2008     /// Constructs a new `Weak<T>`, without allocating memory.
2009     /// Calling [`upgrade`] on the return value always
2010     /// gives [`None`].
2011     ///
2012     /// [`upgrade`]: Weak::upgrade
2013     ///
2014     /// # Examples
2015     ///
2016     /// ```
2017     /// use std::sync::Weak;
2018     ///
2019     /// let empty: Weak<i64> = Default::default();
2020     /// assert!(empty.upgrade().is_none());
2021     /// ```
2022     fn default() -> Weak<T> {
2023         Weak::new()
2024     }
2025 }
2026
2027 #[stable(feature = "arc_weak", since = "1.4.0")]
2028 unsafe impl<#[may_dangle] T: ?Sized> Drop for Weak<T> {
2029     /// Drops the `Weak` pointer.
2030     ///
2031     /// # Examples
2032     ///
2033     /// ```
2034     /// use std::sync::{Arc, Weak};
2035     ///
2036     /// struct Foo;
2037     ///
2038     /// impl Drop for Foo {
2039     ///     fn drop(&mut self) {
2040     ///         println!("dropped!");
2041     ///     }
2042     /// }
2043     ///
2044     /// let foo = Arc::new(Foo);
2045     /// let weak_foo = Arc::downgrade(&foo);
2046     /// let other_weak_foo = Weak::clone(&weak_foo);
2047     ///
2048     /// drop(weak_foo);   // Doesn't print anything
2049     /// drop(foo);        // Prints "dropped!"
2050     ///
2051     /// assert!(other_weak_foo.upgrade().is_none());
2052     /// ```
2053     fn drop(&mut self) {
2054         // If we find out that we were the last weak pointer, then its time to
2055         // deallocate the data entirely. See the discussion in Arc::drop() about
2056         // the memory orderings
2057         //
2058         // It's not necessary to check for the locked state here, because the
2059         // weak count can only be locked if there was precisely one weak ref,
2060         // meaning that drop could only subsequently run ON that remaining weak
2061         // ref, which can only happen after the lock is released.
2062         let inner = if let Some(inner) = self.inner() { inner } else { return };
2063
2064         if inner.weak.fetch_sub(1, Release) == 1 {
2065             acquire!(inner.weak);
2066             unsafe { Global.deallocate(self.ptr.cast(), Layout::for_value_raw(self.ptr.as_ptr())) }
2067         }
2068     }
2069 }
2070
2071 #[stable(feature = "rust1", since = "1.0.0")]
2072 trait ArcEqIdent<T: ?Sized + PartialEq> {
2073     fn eq(&self, other: &Arc<T>) -> bool;
2074     fn ne(&self, other: &Arc<T>) -> bool;
2075 }
2076
2077 #[stable(feature = "rust1", since = "1.0.0")]
2078 impl<T: ?Sized + PartialEq> ArcEqIdent<T> for Arc<T> {
2079     #[inline]
2080     default fn eq(&self, other: &Arc<T>) -> bool {
2081         **self == **other
2082     }
2083     #[inline]
2084     default fn ne(&self, other: &Arc<T>) -> bool {
2085         **self != **other
2086     }
2087 }
2088
2089 /// We're doing this specialization here, and not as a more general optimization on `&T`, because it
2090 /// would otherwise add a cost to all equality checks on refs. We assume that `Arc`s are used to
2091 /// store large values, that are slow to clone, but also heavy to check for equality, causing this
2092 /// cost to pay off more easily. It's also more likely to have two `Arc` clones, that point to
2093 /// the same value, than two `&T`s.
2094 ///
2095 /// We can only do this when `T: Eq` as a `PartialEq` might be deliberately irreflexive.
2096 #[stable(feature = "rust1", since = "1.0.0")]
2097 impl<T: ?Sized + crate::rc::MarkerEq> ArcEqIdent<T> for Arc<T> {
2098     #[inline]
2099     fn eq(&self, other: &Arc<T>) -> bool {
2100         Arc::ptr_eq(self, other) || **self == **other
2101     }
2102
2103     #[inline]
2104     fn ne(&self, other: &Arc<T>) -> bool {
2105         !Arc::ptr_eq(self, other) && **self != **other
2106     }
2107 }
2108
2109 #[stable(feature = "rust1", since = "1.0.0")]
2110 impl<T: ?Sized + PartialEq> PartialEq for Arc<T> {
2111     /// Equality for two `Arc`s.
2112     ///
2113     /// Two `Arc`s are equal if their inner values are equal, even if they are
2114     /// stored in different allocation.
2115     ///
2116     /// If `T` also implements `Eq` (implying reflexivity of equality),
2117     /// two `Arc`s that point to the same allocation are always equal.
2118     ///
2119     /// # Examples
2120     ///
2121     /// ```
2122     /// use std::sync::Arc;
2123     ///
2124     /// let five = Arc::new(5);
2125     ///
2126     /// assert!(five == Arc::new(5));
2127     /// ```
2128     #[inline]
2129     fn eq(&self, other: &Arc<T>) -> bool {
2130         ArcEqIdent::eq(self, other)
2131     }
2132
2133     /// Inequality for two `Arc`s.
2134     ///
2135     /// Two `Arc`s are unequal if their inner values are unequal.
2136     ///
2137     /// If `T` also implements `Eq` (implying reflexivity of equality),
2138     /// two `Arc`s that point to the same value are never unequal.
2139     ///
2140     /// # Examples
2141     ///
2142     /// ```
2143     /// use std::sync::Arc;
2144     ///
2145     /// let five = Arc::new(5);
2146     ///
2147     /// assert!(five != Arc::new(6));
2148     /// ```
2149     #[inline]
2150     fn ne(&self, other: &Arc<T>) -> bool {
2151         ArcEqIdent::ne(self, other)
2152     }
2153 }
2154
2155 #[stable(feature = "rust1", since = "1.0.0")]
2156 impl<T: ?Sized + PartialOrd> PartialOrd for Arc<T> {
2157     /// Partial comparison for two `Arc`s.
2158     ///
2159     /// The two are compared by calling `partial_cmp()` on their inner values.
2160     ///
2161     /// # Examples
2162     ///
2163     /// ```
2164     /// use std::sync::Arc;
2165     /// use std::cmp::Ordering;
2166     ///
2167     /// let five = Arc::new(5);
2168     ///
2169     /// assert_eq!(Some(Ordering::Less), five.partial_cmp(&Arc::new(6)));
2170     /// ```
2171     fn partial_cmp(&self, other: &Arc<T>) -> Option<Ordering> {
2172         (**self).partial_cmp(&**other)
2173     }
2174
2175     /// Less-than comparison for two `Arc`s.
2176     ///
2177     /// The two are compared by calling `<` on their inner values.
2178     ///
2179     /// # Examples
2180     ///
2181     /// ```
2182     /// use std::sync::Arc;
2183     ///
2184     /// let five = Arc::new(5);
2185     ///
2186     /// assert!(five < Arc::new(6));
2187     /// ```
2188     fn lt(&self, other: &Arc<T>) -> bool {
2189         *(*self) < *(*other)
2190     }
2191
2192     /// 'Less than or equal to' comparison for two `Arc`s.
2193     ///
2194     /// The two are compared by calling `<=` on their inner values.
2195     ///
2196     /// # Examples
2197     ///
2198     /// ```
2199     /// use std::sync::Arc;
2200     ///
2201     /// let five = Arc::new(5);
2202     ///
2203     /// assert!(five <= Arc::new(5));
2204     /// ```
2205     fn le(&self, other: &Arc<T>) -> bool {
2206         *(*self) <= *(*other)
2207     }
2208
2209     /// Greater-than comparison for two `Arc`s.
2210     ///
2211     /// The two are compared by calling `>` on their inner values.
2212     ///
2213     /// # Examples
2214     ///
2215     /// ```
2216     /// use std::sync::Arc;
2217     ///
2218     /// let five = Arc::new(5);
2219     ///
2220     /// assert!(five > Arc::new(4));
2221     /// ```
2222     fn gt(&self, other: &Arc<T>) -> bool {
2223         *(*self) > *(*other)
2224     }
2225
2226     /// 'Greater than or equal to' comparison for two `Arc`s.
2227     ///
2228     /// The two are compared by calling `>=` on their inner values.
2229     ///
2230     /// # Examples
2231     ///
2232     /// ```
2233     /// use std::sync::Arc;
2234     ///
2235     /// let five = Arc::new(5);
2236     ///
2237     /// assert!(five >= Arc::new(5));
2238     /// ```
2239     fn ge(&self, other: &Arc<T>) -> bool {
2240         *(*self) >= *(*other)
2241     }
2242 }
2243 #[stable(feature = "rust1", since = "1.0.0")]
2244 impl<T: ?Sized + Ord> Ord for Arc<T> {
2245     /// Comparison for two `Arc`s.
2246     ///
2247     /// The two are compared by calling `cmp()` on their inner values.
2248     ///
2249     /// # Examples
2250     ///
2251     /// ```
2252     /// use std::sync::Arc;
2253     /// use std::cmp::Ordering;
2254     ///
2255     /// let five = Arc::new(5);
2256     ///
2257     /// assert_eq!(Ordering::Less, five.cmp(&Arc::new(6)));
2258     /// ```
2259     fn cmp(&self, other: &Arc<T>) -> Ordering {
2260         (**self).cmp(&**other)
2261     }
2262 }
2263 #[stable(feature = "rust1", since = "1.0.0")]
2264 impl<T: ?Sized + Eq> Eq for Arc<T> {}
2265
2266 #[stable(feature = "rust1", since = "1.0.0")]
2267 impl<T: ?Sized + fmt::Display> fmt::Display for Arc<T> {
2268     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2269         fmt::Display::fmt(&**self, f)
2270     }
2271 }
2272
2273 #[stable(feature = "rust1", since = "1.0.0")]
2274 impl<T: ?Sized + fmt::Debug> fmt::Debug for Arc<T> {
2275     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2276         fmt::Debug::fmt(&**self, f)
2277     }
2278 }
2279
2280 #[stable(feature = "rust1", since = "1.0.0")]
2281 impl<T: ?Sized> fmt::Pointer for Arc<T> {
2282     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2283         fmt::Pointer::fmt(&(&**self as *const T), f)
2284     }
2285 }
2286
2287 #[cfg(not(no_global_oom_handling))]
2288 #[stable(feature = "rust1", since = "1.0.0")]
2289 impl<T: Default> Default for Arc<T> {
2290     /// Creates a new `Arc<T>`, with the `Default` value for `T`.
2291     ///
2292     /// # Examples
2293     ///
2294     /// ```
2295     /// use std::sync::Arc;
2296     ///
2297     /// let x: Arc<i32> = Default::default();
2298     /// assert_eq!(*x, 0);
2299     /// ```
2300     fn default() -> Arc<T> {
2301         Arc::new(Default::default())
2302     }
2303 }
2304
2305 #[stable(feature = "rust1", since = "1.0.0")]
2306 impl<T: ?Sized + Hash> Hash for Arc<T> {
2307     fn hash<H: Hasher>(&self, state: &mut H) {
2308         (**self).hash(state)
2309     }
2310 }
2311
2312 #[cfg(not(no_global_oom_handling))]
2313 #[stable(feature = "from_for_ptrs", since = "1.6.0")]
2314 impl<T> From<T> for Arc<T> {
2315     /// Converts a `T` into an `Arc<T>`
2316     ///
2317     /// The conversion moves the value into a
2318     /// newly allocated `Arc`. It is equivalent to
2319     /// calling `Arc::new(t)`.
2320     ///
2321     /// # Example
2322     /// ```rust
2323     /// # use std::sync::Arc;
2324     /// let x = 5;
2325     /// let arc = Arc::new(5);
2326     ///
2327     /// assert_eq!(Arc::from(x), arc);
2328     /// ```
2329     fn from(t: T) -> Self {
2330         Arc::new(t)
2331     }
2332 }
2333
2334 #[cfg(not(no_global_oom_handling))]
2335 #[stable(feature = "shared_from_slice", since = "1.21.0")]
2336 impl<T: Clone> From<&[T]> for Arc<[T]> {
2337     /// Allocate a reference-counted slice and fill it by cloning `v`'s items.
2338     ///
2339     /// # Example
2340     ///
2341     /// ```
2342     /// # use std::sync::Arc;
2343     /// let original: &[i32] = &[1, 2, 3];
2344     /// let shared: Arc<[i32]> = Arc::from(original);
2345     /// assert_eq!(&[1, 2, 3], &shared[..]);
2346     /// ```
2347     #[inline]
2348     fn from(v: &[T]) -> Arc<[T]> {
2349         <Self as ArcFromSlice<T>>::from_slice(v)
2350     }
2351 }
2352
2353 #[cfg(not(no_global_oom_handling))]
2354 #[stable(feature = "shared_from_slice", since = "1.21.0")]
2355 impl From<&str> for Arc<str> {
2356     /// Allocate a reference-counted `str` and copy `v` into it.
2357     ///
2358     /// # Example
2359     ///
2360     /// ```
2361     /// # use std::sync::Arc;
2362     /// let shared: Arc<str> = Arc::from("eggplant");
2363     /// assert_eq!("eggplant", &shared[..]);
2364     /// ```
2365     #[inline]
2366     fn from(v: &str) -> Arc<str> {
2367         let arc = Arc::<[u8]>::from(v.as_bytes());
2368         unsafe { Arc::from_raw(Arc::into_raw(arc) as *const str) }
2369     }
2370 }
2371
2372 #[cfg(not(no_global_oom_handling))]
2373 #[stable(feature = "shared_from_slice", since = "1.21.0")]
2374 impl From<String> for Arc<str> {
2375     /// Allocate a reference-counted `str` and copy `v` into it.
2376     ///
2377     /// # Example
2378     ///
2379     /// ```
2380     /// # use std::sync::Arc;
2381     /// let unique: String = "eggplant".to_owned();
2382     /// let shared: Arc<str> = Arc::from(unique);
2383     /// assert_eq!("eggplant", &shared[..]);
2384     /// ```
2385     #[inline]
2386     fn from(v: String) -> Arc<str> {
2387         Arc::from(&v[..])
2388     }
2389 }
2390
2391 #[cfg(not(no_global_oom_handling))]
2392 #[stable(feature = "shared_from_slice", since = "1.21.0")]
2393 impl<T: ?Sized> From<Box<T>> for Arc<T> {
2394     /// Move a boxed object to a new, reference-counted allocation.
2395     ///
2396     /// # Example
2397     ///
2398     /// ```
2399     /// # use std::sync::Arc;
2400     /// let unique: Box<str> = Box::from("eggplant");
2401     /// let shared: Arc<str> = Arc::from(unique);
2402     /// assert_eq!("eggplant", &shared[..]);
2403     /// ```
2404     #[inline]
2405     fn from(v: Box<T>) -> Arc<T> {
2406         Arc::from_box(v)
2407     }
2408 }
2409
2410 #[cfg(not(no_global_oom_handling))]
2411 #[stable(feature = "shared_from_slice", since = "1.21.0")]
2412 impl<T> From<Vec<T>> for Arc<[T]> {
2413     /// Allocate a reference-counted slice and move `v`'s items into it.
2414     ///
2415     /// # Example
2416     ///
2417     /// ```
2418     /// # use std::sync::Arc;
2419     /// let unique: Vec<i32> = vec![1, 2, 3];
2420     /// let shared: Arc<[i32]> = Arc::from(unique);
2421     /// assert_eq!(&[1, 2, 3], &shared[..]);
2422     /// ```
2423     #[inline]
2424     fn from(mut v: Vec<T>) -> Arc<[T]> {
2425         unsafe {
2426             let arc = Arc::copy_from_slice(&v);
2427
2428             // Allow the Vec to free its memory, but not destroy its contents
2429             v.set_len(0);
2430
2431             arc
2432         }
2433     }
2434 }
2435
2436 #[stable(feature = "shared_from_cow", since = "1.45.0")]
2437 impl<'a, B> From<Cow<'a, B>> for Arc<B>
2438 where
2439     B: ToOwned + ?Sized,
2440     Arc<B>: From<&'a B> + From<B::Owned>,
2441 {
2442     /// Create an atomically reference-counted pointer from
2443     /// a clone-on-write pointer by copying its content.
2444     ///
2445     /// # Example
2446     ///
2447     /// ```rust
2448     /// # use std::sync::Arc;
2449     /// # use std::borrow::Cow;
2450     /// let cow: Cow<str> = Cow::Borrowed("eggplant");
2451     /// let shared: Arc<str> = Arc::from(cow);
2452     /// assert_eq!("eggplant", &shared[..]);
2453     /// ```
2454     #[inline]
2455     fn from(cow: Cow<'a, B>) -> Arc<B> {
2456         match cow {
2457             Cow::Borrowed(s) => Arc::from(s),
2458             Cow::Owned(s) => Arc::from(s),
2459         }
2460     }
2461 }
2462
2463 #[stable(feature = "boxed_slice_try_from", since = "1.43.0")]
2464 impl<T, const N: usize> TryFrom<Arc<[T]>> for Arc<[T; N]> {
2465     type Error = Arc<[T]>;
2466
2467     fn try_from(boxed_slice: Arc<[T]>) -> Result<Self, Self::Error> {
2468         if boxed_slice.len() == N {
2469             Ok(unsafe { Arc::from_raw(Arc::into_raw(boxed_slice) as *mut [T; N]) })
2470         } else {
2471             Err(boxed_slice)
2472         }
2473     }
2474 }
2475
2476 #[cfg(not(no_global_oom_handling))]
2477 #[stable(feature = "shared_from_iter", since = "1.37.0")]
2478 impl<T> iter::FromIterator<T> for Arc<[T]> {
2479     /// Takes each element in the `Iterator` and collects it into an `Arc<[T]>`.
2480     ///
2481     /// # Performance characteristics
2482     ///
2483     /// ## The general case
2484     ///
2485     /// In the general case, collecting into `Arc<[T]>` is done by first
2486     /// collecting into a `Vec<T>`. That is, when writing the following:
2487     ///
2488     /// ```rust
2489     /// # use std::sync::Arc;
2490     /// let evens: Arc<[u8]> = (0..10).filter(|&x| x % 2 == 0).collect();
2491     /// # assert_eq!(&*evens, &[0, 2, 4, 6, 8]);
2492     /// ```
2493     ///
2494     /// this behaves as if we wrote:
2495     ///
2496     /// ```rust
2497     /// # use std::sync::Arc;
2498     /// let evens: Arc<[u8]> = (0..10).filter(|&x| x % 2 == 0)
2499     ///     .collect::<Vec<_>>() // The first set of allocations happens here.
2500     ///     .into(); // A second allocation for `Arc<[T]>` happens here.
2501     /// # assert_eq!(&*evens, &[0, 2, 4, 6, 8]);
2502     /// ```
2503     ///
2504     /// This will allocate as many times as needed for constructing the `Vec<T>`
2505     /// and then it will allocate once for turning the `Vec<T>` into the `Arc<[T]>`.
2506     ///
2507     /// ## Iterators of known length
2508     ///
2509     /// When your `Iterator` implements `TrustedLen` and is of an exact size,
2510     /// a single allocation will be made for the `Arc<[T]>`. For example:
2511     ///
2512     /// ```rust
2513     /// # use std::sync::Arc;
2514     /// let evens: Arc<[u8]> = (0..10).collect(); // Just a single allocation happens here.
2515     /// # assert_eq!(&*evens, &*(0..10).collect::<Vec<_>>());
2516     /// ```
2517     fn from_iter<I: iter::IntoIterator<Item = T>>(iter: I) -> Self {
2518         ToArcSlice::to_arc_slice(iter.into_iter())
2519     }
2520 }
2521
2522 /// Specialization trait used for collecting into `Arc<[T]>`.
2523 trait ToArcSlice<T>: Iterator<Item = T> + Sized {
2524     fn to_arc_slice(self) -> Arc<[T]>;
2525 }
2526
2527 #[cfg(not(no_global_oom_handling))]
2528 impl<T, I: Iterator<Item = T>> ToArcSlice<T> for I {
2529     default fn to_arc_slice(self) -> Arc<[T]> {
2530         self.collect::<Vec<T>>().into()
2531     }
2532 }
2533
2534 #[cfg(not(no_global_oom_handling))]
2535 impl<T, I: iter::TrustedLen<Item = T>> ToArcSlice<T> for I {
2536     fn to_arc_slice(self) -> Arc<[T]> {
2537         // This is the case for a `TrustedLen` iterator.
2538         let (low, high) = self.size_hint();
2539         if let Some(high) = high {
2540             debug_assert_eq!(
2541                 low,
2542                 high,
2543                 "TrustedLen iterator's size hint is not exact: {:?}",
2544                 (low, high)
2545             );
2546
2547             unsafe {
2548                 // SAFETY: We need to ensure that the iterator has an exact length and we have.
2549                 Arc::from_iter_exact(self, low)
2550             }
2551         } else {
2552             // TrustedLen contract guarantees that `upper_bound == `None` implies an iterator
2553             // length exceeding `usize::MAX`.
2554             // The default implementation would collect into a vec which would panic.
2555             // Thus we panic here immediately without invoking `Vec` code.
2556             panic!("capacity overflow");
2557         }
2558     }
2559 }
2560
2561 #[stable(feature = "rust1", since = "1.0.0")]
2562 impl<T: ?Sized> borrow::Borrow<T> for Arc<T> {
2563     fn borrow(&self) -> &T {
2564         &**self
2565     }
2566 }
2567
2568 #[stable(since = "1.5.0", feature = "smart_ptr_as_ref")]
2569 impl<T: ?Sized> AsRef<T> for Arc<T> {
2570     fn as_ref(&self) -> &T {
2571         &**self
2572     }
2573 }
2574
2575 #[stable(feature = "pin", since = "1.33.0")]
2576 impl<T: ?Sized> Unpin for Arc<T> {}
2577
2578 /// Get the offset within an `ArcInner` for the payload behind a pointer.
2579 ///
2580 /// # Safety
2581 ///
2582 /// The pointer must point to (and have valid metadata for) a previously
2583 /// valid instance of T, but the T is allowed to be dropped.
2584 unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
2585     // Align the unsized value to the end of the ArcInner.
2586     // Because RcBox is repr(C), it will always be the last field in memory.
2587     // SAFETY: since the only unsized types possible are slices, trait objects,
2588     // and extern types, the input safety requirement is currently enough to
2589     // satisfy the requirements of align_of_val_raw; this is an implementation
2590     // detail of the language that may not be relied upon outside of std.
2591     unsafe { data_offset_align(align_of_val_raw(ptr)) }
2592 }
2593
2594 #[inline]
2595 fn data_offset_align(align: usize) -> isize {
2596     let layout = Layout::new::<ArcInner<()>>();
2597     (layout.size() + layout.padding_needed_for(align)) as isize
2598 }