Skip to main content

mapping/
page_request.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use delivery_blob::compression::{ChunkedArchiveError, DataBuffer};
6use std::ops::Range;
7use storage_ptr_slice::MutPtrByteSlice;
8
9/// Trait for servicing a page request.
10pub trait PageRequest: DataBuffer {
11    /// Prepares the target buffer for reading `read_range`.
12    ///
13    /// `read_alignment` specifies the alignment boundary used when delivering chunks for Merkle
14    /// verification (ignored by direct pager implementations that supply pages without a verifier).
15    ///
16    /// Must be called at most once prior to accessing the buffer slice or committing data.
17    fn prepare(
18        &mut self,
19        read_range: Range<u64>,
20        read_alignment: usize,
21    ) -> Result<(), ChunkedArchiveError>;
22}
23
24/// A no-op [`PageRequest`] for intermediate mapper sessions that do not run a kernel pager thread.
25pub struct NullPageRequest;
26
27impl DataBuffer for NullPageRequest {
28    fn range(&self) -> Range<u64> {
29        0..0
30    }
31
32    fn mut_ptr_slice(&mut self) -> MutPtrByteSlice<'_> {
33        MutPtrByteSlice::from(&mut [][..])
34    }
35
36    fn commit(&mut self, _size: usize) -> Result<(), ChunkedArchiveError> {
37        Ok(())
38    }
39}
40
41impl PageRequest for NullPageRequest {
42    fn prepare(
43        &mut self,
44        _read_range: Range<u64>,
45        _read_alignment: usize,
46    ) -> Result<(), ChunkedArchiveError> {
47        Ok(())
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn test_null_page_request() {
57        let mut req = NullPageRequest;
58        assert_eq!(req.range(), 0..0);
59        assert!(req.prepare(0..4096, 128 * 1024).is_ok());
60        assert_eq!(req.mut_ptr_slice().len(), 0);
61        assert!(req.commit(0).is_ok());
62    }
63}