#pin #weak #rc #arc


Small wrapper around an equivalent of Pin<Weak>

1 stable release

1.0.0 Aug 3, 2020

#98 in Memory management

Download history 76/week @ 2021-01-20 171/week @ 2021-01-27 15/week @ 2021-02-03 84/week @ 2021-02-10 71/week @ 2021-02-17 15/week @ 2021-02-24 11/week @ 2021-03-03 114/week @ 2021-03-10 200/week @ 2021-03-17 84/week @ 2021-03-24 130/week @ 2021-03-31 175/week @ 2021-04-07 247/week @ 2021-04-14 376/week @ 2021-04-21 183/week @ 2021-04-28 171/week @ 2021-05-05

246 downloads per month
Used in 7 crates (4 directly)

MIT license

71 lines

Crates.io Documentation


This create provides weak pointers for Pin<std::rc::Rc<T>> and Pin<std::rc::Arc<T>>


Pin<std::rc::Rc<T>> and Pin<std::rc::Arc<T>> cannot be converted safely to their Weak<T> equivalent if T does not implement Unpin. That's because it would otherwise be possible to do something like this:

struct SomeStruct(PhantomPinned);
let pinned = Rc::pin(SomeStruct(PhantomPinned));

// This is unsafe ...
let weak = unsafe {

// ... because otherwise it would be possible to move the content of pinned:
let mut unpinned_rc = weak.upgrade().unwrap();
std::mem::drop((pinned, weak));
// unpinned_rc is now the only reference so this will work:
let x = std::mem::replace(
    Rc::get_mut(&mut unpinned_rc).unwrap(),

In that example, x is the original SomeStruct which we moved in memory, that is undefined behavior, do not do that at home.


This crate simply provide a rc::PinWeak and sync::PinWeak which allow to get weak pointer from Pin<std::rc::Rc> and Pin<srd::sync::Arc>.

This is safe because you can one can only get back a Pin out of it when trying to upgrade the weak pointer.

PinWeak can be created using the PinWeak downgrade function.


use pin_weak::rc::*;
struct SomeStruct(PhantomPinned, usize);
let pinned = Rc::pin(SomeStruct(PhantomPinned, 42));
let weak = PinWeak::downgrade(pinned.clone());
assert_eq!(weak.upgrade().unwrap().1, 42);



No runtime deps