# Pin
When do you need the function to take `Pin<_>` as the argument? If any of the following is true:
* The function expects the object pinned (i.e. the object should have a fixed address), this is a sign of starting relying on pin safety guarantee.
* The function is a mutable one (i.e. it would take a `&mut self`) and may be called after the object is pinned. Reason: otherwise users may need to use `unsafe` to call these function.
* What about the function may be called before pinned? A duplicate `&mut self` version or rely on `pin-init` so all mutable functions take `Pin<&mut Self>` ???
`UNPIN` functions:
The Pin safety guarantee (once pinned, always pinned) may be too restrict sometimes, and
* Put an `# Unpin` comments on the functions that make the object movable again (e.g. removing the object from a global list), notes these functions themselves have to be a `Pin<_>` function. For example,
```rust=
struct A {
...
_pin: PhantomPinned,
}
impl A {
/// Puts on a list for execution.
pub fn queue(self: Pin<&mut Self>)
/// # Unpin
///
/// Removes the object from the global list when return,
/// can be moved after this.
pub fn wait_for_finish(self: Pin<&mut Self>)
}
```
Then if these `# Unpin` functions are used to make the objects movable. Add a `UNSOUND: UNPIN:` comment as the move point, e.g.
```rust=
let a = A::new(..);
// UNSOUND: SAFETY: `a` may be moved afterwards, but that's after
// a Unpin function.
let pin = unsafe { Pin::new_unchecked(&mut a)};
pin.as_mut().queue();
// UNSOUND: UNPIN: `wait_for_finish()` makes `a` movable again.
pin.wait_for_finish();
// UNSOUND: Moves `a`.
let b = Box::new(a);
```