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 #[must_use]
16 fn less_than(&self, rhs: Self) -> bool;
17 #[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
63pub 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}