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    /// Must be called at most once prior to accessing the buffer slice or committing data.
14    fn prepare(&mut self, read_range: Range<u64>) -> Result<(), ChunkedArchiveError>;
15}
16
17/// A no-op [`PageRequest`] for intermediate mapper sessions that do not run a kernel pager thread.
18pub struct NullPageRequest;
19
20impl DataBuffer for NullPageRequest {
21    fn range(&self) -> Range<u64> {
22        0..0
23    }
24
25    fn mut_ptr_slice(&mut self) -> MutPtrByteSlice<'_> {
26        MutPtrByteSlice::from(&mut [][..])
27    }
28
29    fn commit(&mut self, _size: usize) -> Result<(), ChunkedArchiveError> {
30        Ok(())
31    }
32}
33
34impl PageRequest for NullPageRequest {
35    fn prepare(&mut self, _read_range: Range<u64>) -> Result<(), ChunkedArchiveError> {
36        Ok(())
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_null_page_request() {
46        let mut req = NullPageRequest;
47        assert_eq!(req.range(), 0..0);
48        assert!(req.prepare(0..4096).is_ok());
49        assert_eq!(req.mut_ptr_slice().len(), 0);
50        assert!(req.commit(0).is_ok());
51    }
52}