1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use core::{ fmt, mem };
use core::ops::{ Deref, DerefMut };
#[cfg(not(feature = "use_std"))] use memsec::memzero;
#[cfg(feature = "use_std")] use memsec::{ mlock, munlock };
use ::ZeroSafe;
pub struct TempKey<'a, T: ?Sized + 'static>(&'a mut T);
impl<'a, T: ?Sized> TempKey<'a, T> {
pub unsafe fn unsafe_from(t: &'a mut T) -> TempKey<'a, T> {
#[cfg(feature = "use_std")]
mlock(t as *mut T as *mut u8, mem::size_of_val(t));
TempKey(t)
}
}
impl<'a, T: ?Sized + ZeroSafe> From<&'a mut T> for TempKey<'a, T> {
fn from(t: &'a mut T) -> TempKey<'a, T> {
unsafe { TempKey::unsafe_from(t) }
}
}
impl<'a, T: ?Sized> Deref for TempKey<'a, T> {
type Target = T;
fn deref(&self) -> &T {
self.0
}
}
impl<'a, T: ?Sized> DerefMut for TempKey<'a, T> {
fn deref_mut(&mut self) -> &mut T {
self.0
}
}
impl<'a, T: ?Sized> fmt::Debug for TempKey<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple("TempKey")
.field(&format_args!("{:p}", self.0))
.finish()
}
}
impl<'a, T: ?Sized> Drop for TempKey<'a, T> {
fn drop(&mut self) {
let size = mem::size_of_val(self.0);
#[cfg(feature = "use_std")]
unsafe { munlock(self.0 as *mut T as *mut u8, size) };
#[cfg(not(feature = "use_std"))]
unsafe { memzero(self.0 as *mut T as *mut u8, size) };
}
}