1 // Copyright 2018 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/memory/shared_memory_mapping.h" 6 7 #include <utility> 8 9 #include "base/logging.h" 10 // Unsupported in libchrome 11 // #include "base/memory/shared_memory_tracker.h" 12 #include "base/unguessable_token.h" 13 #include "build/build_config.h" 14 15 #if defined(OS_POSIX) 16 #include <sys/mman.h> 17 #endif 18 19 #if defined(OS_WIN) 20 #include <aclapi.h> 21 #endif 22 23 #if defined(OS_MACOSX) && !defined(OS_IOS) 24 #include <mach/mach_vm.h> 25 #include "base/mac/mach_logging.h" 26 #endif 27 28 #if defined(OS_FUCHSIA) 29 #include <zircon/process.h> 30 #include <zircon/status.h> 31 #include <zircon/syscalls.h> 32 #endif 33 34 namespace base { 35 36 SharedMemoryMapping::SharedMemoryMapping() = default; 37 38 SharedMemoryMapping::SharedMemoryMapping(SharedMemoryMapping&& mapping) 39 : memory_(mapping.memory_), 40 size_(mapping.size_), 41 mapped_size_(mapping.mapped_size_), 42 guid_(mapping.guid_) { 43 mapping.memory_ = nullptr; 44 } 45 46 SharedMemoryMapping& SharedMemoryMapping::operator=( 47 SharedMemoryMapping&& mapping) { 48 Unmap(); 49 memory_ = mapping.memory_; 50 size_ = mapping.size_; 51 mapped_size_ = mapping.mapped_size_; 52 guid_ = mapping.guid_; 53 mapping.memory_ = nullptr; 54 return *this; 55 } 56 57 SharedMemoryMapping::~SharedMemoryMapping() { 58 Unmap(); 59 } 60 61 SharedMemoryMapping::SharedMemoryMapping(void* memory, 62 size_t size, 63 size_t mapped_size, 64 const UnguessableToken& guid) 65 : memory_(memory), size_(size), mapped_size_(mapped_size), guid_(guid) { 66 // Unsupported in libchrome. 67 // SharedMemoryTracker::GetInstance()->IncrementMemoryUsage(*this); 68 } 69 70 void SharedMemoryMapping::Unmap() { 71 if (!IsValid()) 72 return; 73 // Unsupported in libchrome. 74 // SharedMemoryTracker::GetInstance()->DecrementMemoryUsage(*this); 75 #if defined(OS_WIN) 76 if (!UnmapViewOfFile(memory_)) 77 DPLOG(ERROR) << "UnmapViewOfFile"; 78 #elif defined(OS_FUCHSIA) 79 uintptr_t addr = reinterpret_cast<uintptr_t>(memory_); 80 zx_status_t status = zx_vmar_unmap(zx_vmar_root_self(), addr, size_); 81 DLOG_IF(ERROR, status != ZX_OK) 82 << "zx_vmar_unmap failed: " << zx_status_get_string(status); 83 #elif defined(OS_MACOSX) && !defined(OS_IOS) 84 kern_return_t kr = mach_vm_deallocate( 85 mach_task_self(), reinterpret_cast<mach_vm_address_t>(memory_), size_); 86 MACH_DLOG_IF(ERROR, kr != KERN_SUCCESS, kr) << "mach_vm_deallocate"; 87 #else 88 if (munmap(memory_, size_) < 0) 89 DPLOG(ERROR) << "munmap"; 90 #endif 91 } 92 93 ReadOnlySharedMemoryMapping::ReadOnlySharedMemoryMapping() = default; 94 ReadOnlySharedMemoryMapping::ReadOnlySharedMemoryMapping( 95 ReadOnlySharedMemoryMapping&&) = default; 96 ReadOnlySharedMemoryMapping& ReadOnlySharedMemoryMapping::operator=( 97 ReadOnlySharedMemoryMapping&&) = default; 98 ReadOnlySharedMemoryMapping::ReadOnlySharedMemoryMapping( 99 void* address, 100 size_t size, 101 size_t mapped_size, 102 const UnguessableToken& guid) 103 : SharedMemoryMapping(address, size, mapped_size, guid) {} 104 105 WritableSharedMemoryMapping::WritableSharedMemoryMapping() = default; 106 WritableSharedMemoryMapping::WritableSharedMemoryMapping( 107 WritableSharedMemoryMapping&&) = default; 108 WritableSharedMemoryMapping& WritableSharedMemoryMapping::operator=( 109 WritableSharedMemoryMapping&&) = default; 110 WritableSharedMemoryMapping::WritableSharedMemoryMapping( 111 void* address, 112 size_t size, 113 size_t mapped_size, 114 const UnguessableToken& guid) 115 : SharedMemoryMapping(address, size, mapped_size, guid) {} 116 117 } // namespace base 118