1 //! Limitations and common pitfalls. 2 //! 3 //! # Sized types 4 //! 5 //! This currently works only for `Sized` types. Unsized types have „fat pointers“, which are twice 6 //! as large as the normal ones. The [`AtomicPtr`] doesn't support them. One could use something 7 //! like `AtomicU128` for them. The catch is this doesn't exist and the difference would make it 8 //! really hard to implement the debt storage/stripped down hazard pointers. 9 //! 10 //! A workaround is to use double indirection: 11 //! 12 //! ```rust 13 //! # use arc_swap::ArcSwap; 14 //! // This doesn't work: 15 //! // let data: ArcSwap<[u8]> = ArcSwap::new(Arc::from([1, 2, 3])); 16 //! 17 //! // But this does: 18 //! let data: ArcSwap<Box<[u8]>> = ArcSwap::from_pointee(Box::new([1, 2, 3])); 19 //! # drop(data); 20 //! ``` 21 //! 22 //! It also may be possible to use `ArcSwap` with the [`triomphe::ThinArc`] (that crate needs 23 //! enabling a feature flag to cooperate with `ArcSwap`). 24 //! 25 //! # Too many [`Guard`]s 26 //! 27 //! There's only limited number of "fast" slots for borrowing from [`ArcSwap`] for each single 28 //! thread (currently 8, but this might change in future versions). If these run out, the algorithm 29 //! falls back to slower path. 30 //! 31 //! If too many [`Guard`]s are kept around, the performance might be poor. These are not intended 32 //! to be stored in data structures or used across async yield points. 33 //! 34 //! [`ArcSwap`]: crate::ArcSwap 35 //! [`Guard`]: crate::Guard 36 //! [`AtomicPtr`]: std::sync::atomic::AtomicPtr 37 //! 38 //! # No `Clone` implementation 39 //! 40 //! Previous version implemented [`Clone`], but it turned out to be very confusing to people, since 41 //! it created fully independent [`ArcSwap`]. Users expected the instances to be tied to each 42 //! other, that store in one would change the result of future load of the other. 43 //! 44 //! To emulate the original behaviour, one can do something like this: 45 //! 46 //! ```rust 47 //! # use arc_swap::ArcSwap; 48 //! # let old = ArcSwap::from_pointee(42); 49 //! let new = ArcSwap::new(old.load_full()); 50 //! # let _ = new; 51 //! ``` 52 //! 53 //! [`triomphe::ThinArc`]: https://docs.rs/triomphe/latest/triomphe/struct.ThinArc.html 54