Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/memory/shared_memory_handle.h" | 5 #include "base/memory/shared_memory_handle.h" |
| 6 | 6 |
| 7 #include <mach/mach_vm.h> | 7 #include <mach/mach_vm.h> |
| 8 #include <sys/mman.h> | 8 #include <sys/mman.h> |
| 9 #include <unistd.h> | 9 #include <unistd.h> |
| 10 | 10 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 &named_right, | 37 &named_right, |
| 38 MACH_PORT_NULL); // Parent handle. | 38 MACH_PORT_NULL); // Parent handle. |
| 39 if (kr != KERN_SUCCESS) { | 39 if (kr != KERN_SUCCESS) { |
| 40 memory_object_ = MACH_PORT_NULL; | 40 memory_object_ = MACH_PORT_NULL; |
| 41 return; | 41 return; |
| 42 } | 42 } |
| 43 | 43 |
| 44 memory_object_ = named_right; | 44 memory_object_ = named_right; |
| 45 size_ = size; | 45 size_ = size; |
| 46 pid_ = GetCurrentProcId(); | 46 pid_ = GetCurrentProcId(); |
| 47 ownership_passes_to_ipc_ = false; | |
| 47 } | 48 } |
| 48 | 49 |
| 49 SharedMemoryHandle::SharedMemoryHandle(mach_port_t memory_object, | 50 SharedMemoryHandle::SharedMemoryHandle(mach_port_t memory_object, |
| 50 mach_vm_size_t size, | 51 mach_vm_size_t size, |
| 51 base::ProcessId pid) | 52 base::ProcessId pid) |
| 52 : type_(MACH), memory_object_(memory_object), size_(size), pid_(pid) {} | 53 : type_(MACH), |
| 54 memory_object_(memory_object), | |
| 55 size_(size), | |
| 56 pid_(pid), | |
| 57 ownership_passes_to_ipc_(false) {} | |
| 53 | 58 |
| 54 SharedMemoryHandle::SharedMemoryHandle(const SharedMemoryHandle& handle) | 59 SharedMemoryHandle::SharedMemoryHandle(const SharedMemoryHandle& handle) |
| 55 : type_(handle.type_) { | 60 : type_(handle.type_) { |
| 56 CopyRelevantData(handle); | 61 CopyRelevantData(handle); |
| 57 } | 62 } |
| 58 | 63 |
| 59 SharedMemoryHandle& SharedMemoryHandle::operator=( | 64 SharedMemoryHandle& SharedMemoryHandle::operator=( |
| 60 const SharedMemoryHandle& handle) { | 65 const SharedMemoryHandle& handle) { |
| 61 if (this == &handle) | 66 if (this == &handle) |
| 62 return *this; | 67 return *this; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 kern_return_t kr = mach_vm_map( | 180 kern_return_t kr = mach_vm_map( |
| 176 mach_task_self(), | 181 mach_task_self(), |
| 177 reinterpret_cast<mach_vm_address_t*>(memory), // Output parameter | 182 reinterpret_cast<mach_vm_address_t*>(memory), // Output parameter |
| 178 bytes, | 183 bytes, |
| 179 0, // Alignment mask | 184 0, // Alignment mask |
| 180 VM_FLAGS_ANYWHERE, | 185 VM_FLAGS_ANYWHERE, |
| 181 memory_object_, | 186 memory_object_, |
| 182 offset, | 187 offset, |
| 183 FALSE, // Copy | 188 FALSE, // Copy |
| 184 VM_PROT_READ | (read_only ? 0 : VM_PROT_WRITE), // Current protection | 189 VM_PROT_READ | (read_only ? 0 : VM_PROT_WRITE), // Current protection |
| 185 VM_PROT_READ | VM_PROT_WRITE, // Maximum protection | 190 VM_PROT_WRITE | VM_PROT_READ | VM_PROT_IS_MASK, // Maximum protection |
|
Mark Mentovai
2015/10/23 14:24:03
This bit wasn’t defined in 10.6. Does its kernel m
erikchen
2015/10/23 17:13:31
mark: 10.6.8 doesn't have VM_PROT_IS_MASK and will
| |
| 186 VM_INHERIT_NONE); | 191 VM_INHERIT_NONE); |
| 187 return kr == KERN_SUCCESS; | 192 return kr == KERN_SUCCESS; |
| 188 } | 193 } |
| 189 } | 194 } |
| 190 | 195 |
| 191 void SharedMemoryHandle::Close() const { | 196 void SharedMemoryHandle::Close() const { |
| 192 if (!IsValid()) | 197 if (!IsValid()) |
| 193 return; | 198 return; |
| 194 | 199 |
| 195 switch (type_) { | 200 switch (type_) { |
| 196 case POSIX: | 201 case POSIX: |
| 197 if (IGNORE_EINTR(close(file_descriptor_.fd)) < 0) | 202 if (IGNORE_EINTR(close(file_descriptor_.fd)) < 0) |
| 198 DPLOG(ERROR) << "Error closing fd."; | 203 DPLOG(ERROR) << "Error closing fd."; |
| 199 break; | 204 break; |
| 200 case MACH: | 205 case MACH: |
| 201 kern_return_t kr = mach_port_deallocate(mach_task_self(), memory_object_); | 206 kern_return_t kr = mach_port_deallocate(mach_task_self(), memory_object_); |
| 202 if (kr != KERN_SUCCESS) | 207 if (kr != KERN_SUCCESS) |
| 203 DPLOG(ERROR) << "Error deallocating mach port: " << kr; | 208 DPLOG(ERROR) << "Error deallocating mach port: " << kr; |
| 204 break; | 209 break; |
| 205 } | 210 } |
| 206 } | 211 } |
| 207 | 212 |
| 213 void SharedMemoryHandle::SetOwnershipPassesToIPC(bool ownership_passes) { | |
| 214 DCHECK_EQ(type_, MACH); | |
| 215 ownership_passes_to_ipc_ = ownership_passes; | |
| 216 } | |
| 217 | |
| 218 bool SharedMemoryHandle::OwnershipPassesToIPC() const { | |
| 219 DCHECK_EQ(type_, MACH); | |
| 220 return ownership_passes_to_ipc_; | |
| 221 } | |
| 222 | |
| 208 void SharedMemoryHandle::CopyRelevantData(const SharedMemoryHandle& handle) { | 223 void SharedMemoryHandle::CopyRelevantData(const SharedMemoryHandle& handle) { |
| 209 switch (type_) { | 224 switch (type_) { |
| 210 case POSIX: | 225 case POSIX: |
| 211 file_descriptor_ = handle.file_descriptor_; | 226 file_descriptor_ = handle.file_descriptor_; |
| 212 break; | 227 break; |
| 213 case MACH: | 228 case MACH: |
| 214 memory_object_ = handle.memory_object_; | 229 memory_object_ = handle.memory_object_; |
| 215 size_ = handle.size_; | 230 size_ = handle.size_; |
| 216 pid_ = handle.pid_; | 231 pid_ = handle.pid_; |
| 232 ownership_passes_to_ipc_ = handle.ownership_passes_to_ipc_; | |
| 217 break; | 233 break; |
| 218 } | 234 } |
| 219 } | 235 } |
| 220 | 236 |
| 221 } // namespace base | 237 } // namespace base |
| OLD | NEW |