// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/memory/unsafe_shared_memory_region.h" #include #include "base/memory/shared_memory.h" namespace base { // static UnsafeSharedMemoryRegion UnsafeSharedMemoryRegion::Create(size_t size) { subtle::PlatformSharedMemoryRegion handle = subtle::PlatformSharedMemoryRegion::CreateUnsafe(size); return UnsafeSharedMemoryRegion(std::move(handle)); } // static UnsafeSharedMemoryRegion UnsafeSharedMemoryRegion::CreateFromHandle( const SharedMemoryHandle& handle) { if (!handle.IsValid()) return UnsafeSharedMemoryRegion(); auto platform_region = subtle::PlatformSharedMemoryRegion::TakeFromSharedMemoryHandle( handle, subtle::PlatformSharedMemoryRegion::Mode::kUnsafe); if (!platform_region.IsValid()) { return UnsafeSharedMemoryRegion(); } return Deserialize(std::move(platform_region)); } // static UnsafeSharedMemoryRegion UnsafeSharedMemoryRegion::Deserialize( subtle::PlatformSharedMemoryRegion handle) { return UnsafeSharedMemoryRegion(std::move(handle)); } // static subtle::PlatformSharedMemoryRegion UnsafeSharedMemoryRegion::TakeHandleForSerialization( UnsafeSharedMemoryRegion region) { return std::move(region.handle_); } UnsafeSharedMemoryRegion::UnsafeSharedMemoryRegion() = default; UnsafeSharedMemoryRegion::UnsafeSharedMemoryRegion( UnsafeSharedMemoryRegion&& region) = default; UnsafeSharedMemoryRegion& UnsafeSharedMemoryRegion::operator=( UnsafeSharedMemoryRegion&& region) = default; UnsafeSharedMemoryRegion::~UnsafeSharedMemoryRegion() = default; UnsafeSharedMemoryRegion UnsafeSharedMemoryRegion::Duplicate() const { return UnsafeSharedMemoryRegion(handle_.Duplicate()); } WritableSharedMemoryMapping UnsafeSharedMemoryRegion::Map() const { return MapAt(0, handle_.GetSize()); } WritableSharedMemoryMapping UnsafeSharedMemoryRegion::MapAt(off_t offset, size_t size) const { if (!IsValid()) return {}; void* memory = nullptr; size_t mapped_size = 0; if (!handle_.MapAt(offset, size, &memory, &mapped_size)) return {}; return WritableSharedMemoryMapping(memory, size, mapped_size, handle_.GetGUID()); } bool UnsafeSharedMemoryRegion::IsValid() const { return handle_.IsValid(); } UnsafeSharedMemoryRegion::UnsafeSharedMemoryRegion( subtle::PlatformSharedMemoryRegion handle) : handle_(std::move(handle)) { if (handle_.IsValid()) { CHECK_EQ(handle_.GetMode(), subtle::PlatformSharedMemoryRegion::Mode::kUnsafe); } } } // namespace base