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}