Skip to main content

senax_common/
cache.rs

1pub mod db_cache;
2pub mod fast_cache;
3pub mod msec;
4
5#[cfg(all(feature = "uring", target_os = "linux"))]
6pub mod storage_cache;
7#[cfg(not(all(feature = "uring", target_os = "linux")))]
8#[path = "cache/storage_cache_dummy.rs"]
9pub mod storage_cache;
10
11pub trait CycleCounter {
12    #[must_use]
13    fn cycle_add(&self, rhs: Self) -> Self;
14    /// <
15    #[must_use]
16    fn less_than(&self, rhs: Self) -> bool;
17    /// >=
18    #[must_use]
19    fn greater_equal(&self, rhs: Self) -> bool;
20}
21
22impl CycleCounter for u32 {
23    fn cycle_add(&self, rhs: Self) -> Self {
24        self.wrapping_add(rhs)
25    }
26    fn less_than(&self, rhs: Self) -> bool {
27        self.wrapping_sub(rhs) > Self::MAX / 2
28    }
29    fn greater_equal(&self, rhs: Self) -> bool {
30        !self.less_than(rhs)
31    }
32}
33
34impl CycleCounter for i32 {
35    fn cycle_add(&self, rhs: Self) -> Self {
36        let result = self.wrapping_add(rhs);
37        if result < 0 {
38            result - Self::MIN
39        } else {
40            result
41        }
42    }
43    fn less_than(&self, rhs: Self) -> bool {
44        ((*self as u32) << 1).wrapping_sub((rhs as u32) << 1) > u32::MAX / 2
45    }
46    fn greater_equal(&self, rhs: Self) -> bool {
47        !self.less_than(rhs)
48    }
49}
50
51impl CycleCounter for u64 {
52    fn cycle_add(&self, rhs: Self) -> Self {
53        self.wrapping_add(rhs)
54    }
55    fn less_than(&self, rhs: Self) -> bool {
56        self.wrapping_sub(rhs) > Self::MAX / 2
57    }
58    fn greater_equal(&self, rhs: Self) -> bool {
59        !self.less_than(rhs)
60    }
61}
62
63/// assuming MiMalloc
64pub fn calc_mem_size(size: usize) -> usize {
65    if size >= 512 * 1024 {
66        return size.div_ceil(4096) * 4096;
67    }
68    let uintptr_t = std::mem::size_of::<usize>();
69    let mut wsize = size.div_ceil(uintptr_t);
70    if wsize <= 1 {
71        return 8;
72    }
73    if wsize <= 8 {
74        return ((wsize + 1) & !1) * 8;
75    }
76    wsize -= 1;
77    let b = uintptr_t * 8 - 1 - wsize.leading_zeros() as usize;
78    let bin = ((b << 2) + ((wsize >> (b - 2)) & 0x03)) - 3;
79    let rank = bin.div_ceil(4);
80    (16 << rank) - (rank * 4 - bin) * (2 << rank)
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86    #[test]
87    fn test() {
88        assert_eq!(1u32.cycle_add(1), 2);
89        assert!(1u32.less_than(2));
90        assert!(!2u32.less_than(2));
91        assert!(!3u32.less_than(2));
92        assert!(u32::MAX.less_than(1));
93        assert!(0u32.cycle_add(u32::MAX).less_than(1.cycle_add(u32::MAX)));
94        assert!(!1u32.cycle_add(u32::MAX).less_than(0.cycle_add(u32::MAX)));
95        assert!(1u32.cycle_add(u32::MAX).less_than(2.cycle_add(u32::MAX)));
96        assert!(!2u32.cycle_add(u32::MAX).less_than(1.cycle_add(u32::MAX)));
97        assert!(0u32.cycle_add(u32::MAX).less_than(2.cycle_add(u32::MAX)));
98        assert!(!2u32.cycle_add(u32::MAX).less_than(0.cycle_add(u32::MAX)));
99
100        assert_eq!(1i32.cycle_add(1), 2);
101        assert!(1i32.less_than(2));
102        assert!(!2i32.less_than(2));
103        assert!(!3i32.less_than(2));
104        assert!(i32::MAX.less_than(1));
105        assert!(0i32.cycle_add(i32::MAX).less_than(1.cycle_add(i32::MAX)));
106        assert!(!1i32.cycle_add(i32::MAX).less_than(0.cycle_add(i32::MAX)));
107        assert!(1i32.cycle_add(i32::MAX).less_than(2.cycle_add(i32::MAX)));
108        assert!(!2i32.cycle_add(i32::MAX).less_than(1.cycle_add(i32::MAX)));
109        assert!(0i32.cycle_add(i32::MAX).less_than(2.cycle_add(i32::MAX)));
110        assert!(!2i32.cycle_add(i32::MAX).less_than(0.cycle_add(i32::MAX)));
111    }
112
113    #[test]
114    fn test_mem_size() {
115        assert_eq!(calc_mem_size(15), 16);
116        assert_eq!(calc_mem_size(16), 16);
117        assert_eq!(calc_mem_size(17), 32);
118        assert_eq!(calc_mem_size(31), 32);
119        assert_eq!(calc_mem_size(32), 32);
120        assert_eq!(calc_mem_size(33), 48);
121        assert_eq!(calc_mem_size(47), 48);
122        assert_eq!(calc_mem_size(48), 48);
123        assert_eq!(calc_mem_size(49), 64);
124        assert_eq!(calc_mem_size(63), 64);
125        assert_eq!(calc_mem_size(64), 64);
126        assert_eq!(calc_mem_size(65), 80);
127        assert_eq!(calc_mem_size(79), 80);
128        assert_eq!(calc_mem_size(80), 80);
129        assert_eq!(calc_mem_size(81), 96);
130        assert_eq!(calc_mem_size(95), 96);
131        assert_eq!(calc_mem_size(96), 96);
132        assert_eq!(calc_mem_size(97), 112);
133        assert_eq!(calc_mem_size(111), 112);
134        assert_eq!(calc_mem_size(112), 112);
135        assert_eq!(calc_mem_size(113), 128);
136        assert_eq!(calc_mem_size(128), 128);
137        assert_eq!(calc_mem_size(129), 160);
138        assert_eq!(calc_mem_size(160), 160);
139        assert_eq!(calc_mem_size(161), 192);
140        assert_eq!(calc_mem_size(192), 192);
141        assert_eq!(calc_mem_size(193), 224);
142        assert_eq!(calc_mem_size(224), 224);
143        assert_eq!(calc_mem_size(225), 256);
144        assert_eq!(calc_mem_size(256), 256);
145        assert_eq!(calc_mem_size(257), 320);
146        assert_eq!(calc_mem_size(320), 320);
147        assert_eq!(calc_mem_size(321), 384);
148        assert_eq!(calc_mem_size(384), 384);
149        assert_eq!(calc_mem_size(385), 448);
150        assert_eq!(calc_mem_size(448), 448);
151        assert_eq!(calc_mem_size(449), 512);
152        assert_eq!(calc_mem_size(7169), 8192);
153        assert_eq!(calc_mem_size(524288), 524288);
154        assert_eq!(calc_mem_size(524289), 528384);
155    }
156}