1use super::*;
2
3pub(in crate::pagecache) const MAX_WRITERS: Header = 127;
7
8pub(in crate::pagecache) type Header = u64;
9
10pub(crate) const fn is_maxed(v: Header) -> bool {
17 v & (1 << 32) == 1 << 32
18}
19
20pub(crate) const fn mk_maxed(v: Header) -> Header {
21 v | (1 << 32)
22}
23
24pub(crate) const fn is_sealed(v: Header) -> bool {
25 v & (1 << 31) == 1 << 31
26}
27
28pub(crate) const fn mk_sealed(v: Header) -> Header {
29 v | (1 << 31)
30}
31
32pub(crate) const fn n_writers(v: Header) -> Header {
33 (v << 33) >> 57
34}
35
36#[inline]
37pub(crate) fn incr_writers(v: Header) -> Header {
38 assert_ne!(n_writers(v), MAX_WRITERS);
39 v + (1 << 24)
40}
41
42#[inline]
43pub(crate) fn decr_writers(v: Header) -> Header {
44 assert_ne!(n_writers(v), 0);
45 v - (1 << 24)
46}
47
48#[inline]
49pub(crate) fn offset(v: Header) -> usize {
50 let ret = (v << 40) >> 40;
51 usize::try_from(ret).unwrap()
52}
53
54#[inline]
55pub(crate) fn bump_offset(v: Header, by: usize) -> Header {
56 assert_eq!(by >> 24, 0);
57 v + (by as Header)
58}
59
60pub(crate) const fn bump_salt(v: Header) -> Header {
61 (v + (1 << 33)) & 0xFFFF_FFFD_0000_0000
62}
63
64pub(crate) const fn salt(v: Header) -> Header {
65 (v >> 33) << 33
66}