Index: base/memory/shared_memory_handle_mac.cc |
diff --git a/base/memory/shared_memory_handle_mac.cc b/base/memory/shared_memory_handle_mac.cc |
index f590c7889a46b8435d06396014525a328517f548..9dfd3c1aeacbbc1d89fb6b09ffad5c5eec3df23a 100644 |
--- a/base/memory/shared_memory_handle_mac.cc |
+++ b/base/memory/shared_memory_handle_mac.cc |
@@ -67,16 +67,28 @@ SharedMemoryHandle& SharedMemoryHandle::operator=( |
} |
SharedMemoryHandle SharedMemoryHandle::Duplicate() const { |
- if (!IsValid()) |
- return SharedMemoryHandle(MACH_PORT_NULL, 0, 0); |
- |
- // Increment the ref count. |
- kern_return_t kr = mach_port_mod_refs(mach_task_self(), memory_object_, |
- MACH_PORT_RIGHT_SEND, 1); |
- DCHECK_EQ(kr, KERN_SUCCESS); |
- SharedMemoryHandle handle(*this); |
- handle.SetOwnershipPassesToIPC(true); |
- return handle; |
+ switch (type_) { |
+ case POSIX: { |
+ if (!IsValid()) |
+ return SharedMemoryHandle(); |
+ int duped_fd = HANDLE_EINTR(dup(file_descriptor_.fd)); |
+ if (duped_fd < 0) |
+ return SharedMemoryHandle(); |
+ return SharedMemoryHandle(FileDescriptor(duped_fd, true)); |
+ } |
+ case MACH: { |
+ if (!IsValid()) |
+ return SharedMemoryHandle(MACH_PORT_NULL, 0, 0); |
+ |
+ // Increment the ref count. |
+ kern_return_t kr = mach_port_mod_refs(mach_task_self(), memory_object_, |
+ MACH_PORT_RIGHT_SEND, 1); |
+ DCHECK_EQ(kr, KERN_SUCCESS); |
+ SharedMemoryHandle handle(*this); |
+ handle.SetOwnershipPassesToIPC(true); |
+ return handle; |
+ } |
+ } |
} |
bool SharedMemoryHandle::operator==(const SharedMemoryHandle& handle) const { |