cuneiform_fields/hermetic.rs
1//!
2//! Hermetic enables cuneiform to detect cache sizes from OSes which have API to fetch.
3//!
4//! Currently, hermetic argument works only Linux kernel 2.6.32 and above.
5//! If system is different than supported systems it falls back to slabs.
6
7use core::fmt;
8use core::ops::{Deref, DerefMut};
9use cuneiform::cuneiform;
10
11///
12/// Applies padding hermetically detected by cuneiform.
13///
14/// If OS exposes an API to detect coherence line size this padding
15/// type is using that amount to align the field with padding.
16///
17#[cuneiform(hermetic = true)]
18#[derive(Clone, Copy, Default, Hash, PartialEq, Eq)]
19pub struct HermeticPadding<T> {
20 value: T,
21}
22
23unsafe impl<T: Send> Send for HermeticPadding<T> {}
24unsafe impl<T: Sync> Sync for HermeticPadding<T> {}
25
26impl<T> HermeticPadding<T> {
27 /// Applies padding hermetically detected by cuneiform.
28 ///
29 /// # Examples
30 ///
31 /// ```
32 /// use cuneiform_fields::hermetic::HermeticPadding;
33 ///
34 /// let padded = HermeticPadding::new(1);
35 /// ```
36 pub fn new(t: T) -> HermeticPadding<T> {
37 HermeticPadding::<T> { value: t }
38 }
39
40 /// Returns the inner value.
41 ///
42 /// # Examples
43 ///
44 /// ```
45 /// use cuneiform_fields::hermetic::HermeticPadding;
46 ///
47 /// let padded = HermeticPadding::new(7);
48 /// let value = padded.into_inner();
49 /// assert_eq!(value, 7);
50 /// ```
51 pub fn into_inner(self) -> T {
52 self.value
53 }
54}
55
56impl<T> Deref for HermeticPadding<T> {
57 type Target = T;
58
59 fn deref(&self) -> &T {
60 &self.value
61 }
62}
63
64impl<T> DerefMut for HermeticPadding<T> {
65 fn deref_mut(&mut self) -> &mut T {
66 &mut self.value
67 }
68}
69
70impl<T: fmt::Debug> fmt::Debug for HermeticPadding<T> {
71 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
72 f.debug_struct("HermeticPadding")
73 .field("value", &self.value)
74 .finish()
75 }
76}
77
78impl<T> From<T> for HermeticPadding<T> {
79 fn from(t: T) -> Self {
80 HermeticPadding::new(t)
81 }
82}