| // 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 <utility> | 
 |  | 
 | #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::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 |