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