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 
SharedMemoryMapping(SharedMemoryMapping && mapping)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 
operator =(SharedMemoryMapping && mapping)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 
~SharedMemoryMapping()57 SharedMemoryMapping::~SharedMemoryMapping() {
58   Unmap();
59 }
60 
SharedMemoryMapping(void * memory,size_t size,size_t mapped_size,const UnguessableToken & guid)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 
Unmap()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;
ReadOnlySharedMemoryMapping(void * address,size_t size,size_t mapped_size,const UnguessableToken & guid)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;
WritableSharedMemoryMapping(void * address,size_t size,size_t mapped_size,const UnguessableToken & guid)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