xref: /aosp_15_r20/external/crosvm/base/src/sys/windows/shm.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::ffi::CStr;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use win_util::create_file_mapping;
8*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::winnt::PAGE_EXECUTE_READWRITE;
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker use crate::descriptor::FromRawDescriptor;
11*bb4ee6a4SAndroid Build Coastguard Worker use crate::descriptor::SafeDescriptor;
12*bb4ee6a4SAndroid Build Coastguard Worker use crate::shm::PlatformSharedMemory;
13*bb4ee6a4SAndroid Build Coastguard Worker use crate::Result;
14*bb4ee6a4SAndroid Build Coastguard Worker use crate::SharedMemory;
15*bb4ee6a4SAndroid Build Coastguard Worker 
16*bb4ee6a4SAndroid Build Coastguard Worker impl PlatformSharedMemory for SharedMemory {
new(_debug_name: &CStr, size: u64) -> Result<SharedMemory>17*bb4ee6a4SAndroid Build Coastguard Worker     fn new(_debug_name: &CStr, size: u64) -> Result<SharedMemory> {
18*bb4ee6a4SAndroid Build Coastguard Worker         let mapping_handle =
19*bb4ee6a4SAndroid Build Coastguard Worker             // SAFETY:
20*bb4ee6a4SAndroid Build Coastguard Worker             // Safe because we do not provide a handle.
21*bb4ee6a4SAndroid Build Coastguard Worker             unsafe { create_file_mapping(None, size, PAGE_EXECUTE_READWRITE, None) }
22*bb4ee6a4SAndroid Build Coastguard Worker                 .map_err(super::Error::from)?;
23*bb4ee6a4SAndroid Build Coastguard Worker 
24*bb4ee6a4SAndroid Build Coastguard Worker         Self::from_safe_descriptor(
25*bb4ee6a4SAndroid Build Coastguard Worker             // SAFETY:
26*bb4ee6a4SAndroid Build Coastguard Worker             // Safe because we have exclusive ownership of mapping_handle & it is valid.
27*bb4ee6a4SAndroid Build Coastguard Worker             unsafe { SafeDescriptor::from_raw_descriptor(mapping_handle) },
28*bb4ee6a4SAndroid Build Coastguard Worker             size,
29*bb4ee6a4SAndroid Build Coastguard Worker         )
30*bb4ee6a4SAndroid Build Coastguard Worker     }
31*bb4ee6a4SAndroid Build Coastguard Worker 
from_safe_descriptor(mapping_handle: SafeDescriptor, size: u64) -> Result<SharedMemory>32*bb4ee6a4SAndroid Build Coastguard Worker     fn from_safe_descriptor(mapping_handle: SafeDescriptor, size: u64) -> Result<SharedMemory> {
33*bb4ee6a4SAndroid Build Coastguard Worker         Ok(SharedMemory {
34*bb4ee6a4SAndroid Build Coastguard Worker             descriptor: mapping_handle,
35*bb4ee6a4SAndroid Build Coastguard Worker             size,
36*bb4ee6a4SAndroid Build Coastguard Worker         })
37*bb4ee6a4SAndroid Build Coastguard Worker     }
38*bb4ee6a4SAndroid Build Coastguard Worker }
39*bb4ee6a4SAndroid Build Coastguard Worker 
40*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(test)]
41*bb4ee6a4SAndroid Build Coastguard Worker mod test {
42*bb4ee6a4SAndroid Build Coastguard Worker     use winapi::shared::winerror::ERROR_NOT_ENOUGH_MEMORY;
43*bb4ee6a4SAndroid Build Coastguard Worker 
44*bb4ee6a4SAndroid Build Coastguard Worker     use super::*;
45*bb4ee6a4SAndroid Build Coastguard Worker 
46*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg_attr(all(target_os = "windows", target_env = "gnu"), ignore)]
47*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
new_too_huge()48*bb4ee6a4SAndroid Build Coastguard Worker     fn new_too_huge() {
49*bb4ee6a4SAndroid Build Coastguard Worker         let result = SharedMemory::new("test", 0x8000_0000_0000_0000);
50*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
51*bb4ee6a4SAndroid Build Coastguard Worker             result.err().unwrap().errno(),
52*bb4ee6a4SAndroid Build Coastguard Worker             ERROR_NOT_ENOUGH_MEMORY as i32
53*bb4ee6a4SAndroid Build Coastguard Worker         );
54*bb4ee6a4SAndroid Build Coastguard Worker     }
55*bb4ee6a4SAndroid Build Coastguard Worker }
56