|  | // 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/shared_memory_mapping.h" | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/memory/shared_memory_tracker.h" | 
|  | #include "base/unguessable_token.h" | 
|  | #include "build_config.h" | 
|  |  | 
|  | #if defined(OS_POSIX) | 
|  | #include <sys/mman.h> | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | #include <aclapi.h> | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_MACOSX) && !defined(OS_IOS) | 
|  | #include <mach/mach_vm.h> | 
|  | #include "base/mac/mach_logging.h" | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_FUCHSIA) | 
|  | #include <zircon/process.h> | 
|  | #include <zircon/status.h> | 
|  | #include <zircon/syscalls.h> | 
|  | #endif | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | SharedMemoryMapping::SharedMemoryMapping() = default; | 
|  |  | 
|  | SharedMemoryMapping::SharedMemoryMapping(SharedMemoryMapping&& mapping) | 
|  | : memory_(mapping.memory_), | 
|  | size_(mapping.size_), | 
|  | mapped_size_(mapping.mapped_size_), | 
|  | guid_(mapping.guid_) { | 
|  | mapping.memory_ = nullptr; | 
|  | } | 
|  |  | 
|  | SharedMemoryMapping& SharedMemoryMapping::operator=( | 
|  | SharedMemoryMapping&& mapping) { | 
|  | Unmap(); | 
|  | memory_ = mapping.memory_; | 
|  | size_ = mapping.size_; | 
|  | mapped_size_ = mapping.mapped_size_; | 
|  | guid_ = mapping.guid_; | 
|  | mapping.memory_ = nullptr; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | SharedMemoryMapping::~SharedMemoryMapping() { | 
|  | Unmap(); | 
|  | } | 
|  |  | 
|  | SharedMemoryMapping::SharedMemoryMapping(void* memory, | 
|  | size_t size, | 
|  | size_t mapped_size, | 
|  | const UnguessableToken& guid) | 
|  | : memory_(memory), size_(size), mapped_size_(mapped_size), guid_(guid) { | 
|  | SharedMemoryTracker::GetInstance()->IncrementMemoryUsage(*this); | 
|  | } | 
|  |  | 
|  | void SharedMemoryMapping::Unmap() { | 
|  | if (!IsValid()) | 
|  | return; | 
|  |  | 
|  | SharedMemoryTracker::GetInstance()->DecrementMemoryUsage(*this); | 
|  | #if defined(OS_WIN) | 
|  | if (!UnmapViewOfFile(memory_)) | 
|  | DPLOG(ERROR) << "UnmapViewOfFile"; | 
|  | #elif defined(OS_FUCHSIA) | 
|  | uintptr_t addr = reinterpret_cast<uintptr_t>(memory_); | 
|  | zx_status_t status = zx_vmar_unmap(zx_vmar_root_self(), addr, size_); | 
|  | DLOG_IF(ERROR, status != ZX_OK) | 
|  | << "zx_vmar_unmap failed: " << zx_status_get_string(status); | 
|  | #elif defined(OS_MACOSX) && !defined(OS_IOS) | 
|  | kern_return_t kr = mach_vm_deallocate( | 
|  | mach_task_self(), reinterpret_cast<mach_vm_address_t>(memory_), size_); | 
|  | MACH_DLOG_IF(ERROR, kr != KERN_SUCCESS, kr) << "mach_vm_deallocate"; | 
|  | #else | 
|  | if (munmap(memory_, size_) < 0) | 
|  | DPLOG(ERROR) << "munmap"; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | ReadOnlySharedMemoryMapping::ReadOnlySharedMemoryMapping() = default; | 
|  | ReadOnlySharedMemoryMapping::ReadOnlySharedMemoryMapping( | 
|  | ReadOnlySharedMemoryMapping&&) = default; | 
|  | ReadOnlySharedMemoryMapping& ReadOnlySharedMemoryMapping::operator=( | 
|  | ReadOnlySharedMemoryMapping&&) = default; | 
|  | ReadOnlySharedMemoryMapping::ReadOnlySharedMemoryMapping( | 
|  | void* address, | 
|  | size_t size, | 
|  | size_t mapped_size, | 
|  | const UnguessableToken& guid) | 
|  | : SharedMemoryMapping(address, size, mapped_size, guid) {} | 
|  |  | 
|  | WritableSharedMemoryMapping::WritableSharedMemoryMapping() = default; | 
|  | WritableSharedMemoryMapping::WritableSharedMemoryMapping( | 
|  | WritableSharedMemoryMapping&&) = default; | 
|  | WritableSharedMemoryMapping& WritableSharedMemoryMapping::operator=( | 
|  | WritableSharedMemoryMapping&&) = default; | 
|  | WritableSharedMemoryMapping::WritableSharedMemoryMapping( | 
|  | void* address, | 
|  | size_t size, | 
|  | size_t mapped_size, | 
|  | const UnguessableToken& guid) | 
|  | : SharedMemoryMapping(address, size, mapped_size, guid) {} | 
|  |  | 
|  | }  // namespace base |