rtoolbox/
safe_vec.rs
1use std::ops::Deref;
2use std::ops::DerefMut;
3use std::ops::Drop;
4use std::{ptr, sync::atomic};
5
6#[derive(Clone, Debug, PartialEq, Eq)]
8pub struct SafeVec {
9 pub inner: Vec<u8>,
10}
11
12impl SafeVec {
13 pub fn new(inner: Vec<u8>) -> SafeVec {
14 SafeVec { inner: inner }
15 }
16
17 pub fn inner_mut(&mut self) -> &mut Vec<u8> {
18 &mut self.inner
19 }
20}
21
22impl Drop for SafeVec {
23 fn drop(&mut self) {
24 let default = u8::default();
25
26 for c in self.inner.as_mut_slice() {
27 unsafe { ptr::write_volatile(c, default) };
28 }
29
30 atomic::fence(atomic::Ordering::SeqCst);
31 atomic::compiler_fence(atomic::Ordering::SeqCst);
32 }
33}
34
35impl Deref for SafeVec {
36 type Target = [u8];
37
38 fn deref(&self) -> &[u8] {
39 self.inner.deref()
40 }
41}
42
43impl DerefMut for SafeVec {
44 fn deref_mut(&mut self) -> &mut [u8] {
45 self.inner.deref_mut()
46 }
47}