• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! This module contains a type that can make `Send + !Sync` types `Sync` by
2 //! disallowing all immutable access to the value.
3 //!
4 //! A similar primitive is provided in the `sync_wrapper` crate.
5 
6 pub(crate) struct SyncWrapper<T> {
7     value: T,
8 }
9 
10 // safety: The SyncWrapper being send allows you to send the inner value across
11 // thread boundaries.
12 unsafe impl<T: Send> Send for SyncWrapper<T> {}
13 
14 // safety: An immutable reference to a SyncWrapper is useless, so moving such an
15 // immutable reference across threads is safe.
16 unsafe impl<T> Sync for SyncWrapper<T> {}
17 
18 impl<T> SyncWrapper<T> {
new(value: T) -> Self19     pub(crate) fn new(value: T) -> Self {
20         Self { value }
21     }
22 
into_inner(self) -> T23     pub(crate) fn into_inner(self) -> T {
24         self.value
25     }
26 }
27