fn clone(&self) -> Arc<T> {
        // Using a relaxed ordering is alright here, as knowledge of the
        // original reference prevents other threads from erroneously deleting
        // the object.
        //
        // As explained in the [Boost documentation][1], Increasing the
        // reference counter can always be done with memory_order_relaxed: New
        // references to an object can only be formed from an existing
        // reference, and passing an existing reference from one thread to
        // another must already provide any required synchronization.
        //
        // [1]: (www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html)
        let old_size = self.inner().strong.fetch_add(1, Relaxed);

        // However we need to guard against massive refcounts in case someone
        // is `mem::forget`ing Arcs. If we don't do this the count can overflow
        // and users will use-after free. We racily saturate to `isize::MAX` on
        // the assumption that there aren't ~2 billion threads incrementing
        // the reference count at once. This branch will never be taken in
        // any realistic program.
        //
        // We abort because such a program is incredibly degenerate, and we
        // don't care to support it.
        if old_size > MAX_REFCOUNT {
            abort();
        }

        Self::from_inner(self.ptr)
    }
Makes a mutable reference into the given `Arc`.

If there are other `Arc` or [`Weak`] pointers to the same allocation,
then `make_mut` will create a new allocation and invoke [`clone`][clone] on the inner value
to ensure unique ownership. This is also referred to as clone-on-write.

Note that this differs from the behavior of [`Rc::make_mut`] which disassociates
any remaining `Weak` pointers.

See also [`get_mut`][get_mut], which will fail rather than cloning.

[clone]: Clone::clone
[get_mut]: Arc::get_mut
[`Rc::make_mut`]: super::rc::Rc::make_mut

# Examples

```
use std::sync::Arc;

let mut data = Arc::new(5);

*Arc::make_mut(&mut data) += 1;         // Won't clone anything
let mut other_data = Arc::clone(&data); // Won't clone inner data
*Arc::make_mut(&mut data) += 1;         // Clones inner data
*Arc::make_mut(&mut data) += 1;         // Won't clone anything
*Ar
benchmarks/haystacks/code/rust-library.rs