sled/pagecache/
header.rs

1use super::*;
2
3// This is the most writers in a single IO buffer
4// that we have space to accommodate in the counter
5// for writers in the IO buffer header.
6pub(in crate::pagecache) const MAX_WRITERS: Header = 127;
7
8pub(in crate::pagecache) type Header = u64;
9
10// salt: 31 bits
11// maxed: 1 bit
12// seal: 1 bit
13// n_writers: 7 bits
14// offset: 24 bits
15
16pub(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}