| Index: base/memory/shared_memory_mac.cc
|
| diff --git a/base/memory/shared_memory_mac.cc b/base/memory/shared_memory_mac.cc
|
| index 6acaee425ffa48c9bf0eda8ee0749ee21f8e51ca..9a6394949be2c990d117e50e0fe12e15ac06284d 100644
|
| --- a/base/memory/shared_memory_mac.cc
|
| +++ b/base/memory/shared_memory_mac.cc
|
| @@ -83,7 +83,6 @@ bool MakeMachSharedMemoryHandleReadOnly(SharedMemoryHandle* new_handle,
|
|
|
| SharedMemory::SharedMemory()
|
| : mapped_memory_mechanism_(SharedMemoryHandle::MACH),
|
| - readonly_mapped_file_(-1),
|
| mapped_size_(0),
|
| memory_(NULL),
|
| read_only_(false),
|
| @@ -92,7 +91,6 @@ SharedMemory::SharedMemory()
|
| SharedMemory::SharedMemory(const SharedMemoryHandle& handle, bool read_only)
|
| : shm_(handle),
|
| mapped_memory_mechanism_(SharedMemoryHandle::POSIX),
|
| - readonly_mapped_file_(-1),
|
| mapped_size_(0),
|
| memory_(NULL),
|
| read_only_(read_only),
|
| @@ -186,10 +184,12 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
|
| requested_size_ = options.size;
|
|
|
| int mapped_file = -1;
|
| + int readonly_mapped_file = -1;
|
| result = PrepareMapFile(std::move(fp), std::move(readonly_fd), &mapped_file,
|
| - &readonly_mapped_file_);
|
| -
|
| + &readonly_mapped_file);
|
| shm_ = SharedMemoryHandle(FileDescriptor(mapped_file, false));
|
| + readonly_shm_ =
|
| + SharedMemoryHandle(FileDescriptor(readonly_mapped_file, false));
|
| return result;
|
| }
|
|
|
| @@ -254,65 +254,39 @@ void SharedMemory::Close() {
|
| shm_.Close();
|
| shm_ = SharedMemoryHandle();
|
| if (shm_.type_ == SharedMemoryHandle::POSIX) {
|
| - if (readonly_mapped_file_ > 0) {
|
| - if (IGNORE_EINTR(close(readonly_mapped_file_)) < 0)
|
| - PLOG(ERROR) << "close";
|
| - readonly_mapped_file_ = -1;
|
| + if (readonly_shm_.IsValid()) {
|
| + readonly_shm_.Close();
|
| + readonly_shm_ = SharedMemoryHandle();
|
| }
|
| }
|
| }
|
|
|
| -bool SharedMemory::Share(SharedMemoryHandle* new_handle, ShareMode share_mode) {
|
| - if (shm_.type_ == SharedMemoryHandle::MACH) {
|
| - DCHECK(shm_.IsValid());
|
| -
|
| - bool success = false;
|
| - switch (share_mode) {
|
| - case SHARE_CURRENT_MODE:
|
| - *new_handle = shm_.Duplicate();
|
| - success = true;
|
| - break;
|
| - case SHARE_READONLY:
|
| - success = MakeMachSharedMemoryHandleReadOnly(new_handle, shm_, memory_);
|
| - break;
|
| - }
|
| -
|
| - if (success)
|
| - new_handle->SetOwnershipPassesToIPC(true);
|
| -
|
| - return success;
|
| - }
|
| -
|
| - int handle_to_dup = -1;
|
| - switch (share_mode) {
|
| - case SHARE_CURRENT_MODE:
|
| - handle_to_dup = shm_.file_descriptor_.fd;
|
| - break;
|
| - case SHARE_READONLY:
|
| - // We could imagine re-opening the file from /dev/fd, but that can't make
|
| - // it readonly on Mac: https://codereview.chromium.org/27265002/#msg10
|
| - CHECK_GE(readonly_mapped_file_, 0);
|
| - handle_to_dup = readonly_mapped_file_;
|
| - break;
|
| - }
|
| -
|
| - const int new_fd = HANDLE_EINTR(dup(handle_to_dup));
|
| - if (new_fd < 0) {
|
| - DPLOG(ERROR) << "dup() failed.";
|
| - return false;
|
| +SharedMemoryHandle SharedMemory::GetReadOnlyHandle() {
|
| + if (shm_.type_ == SharedMemoryHandle::POSIX) {
|
| + // We could imagine re-opening the file from /dev/fd, but that can't make it
|
| + // readonly on Mac: https://codereview.chromium.org/27265002/#msg10.
|
| + CHECK(readonly_shm_.IsValid());
|
| + return readonly_shm_.Duplicate();
|
| }
|
|
|
| - new_handle->file_descriptor_.fd = new_fd;
|
| - new_handle->type_ = SharedMemoryHandle::POSIX;
|
| + DCHECK(shm_.IsValid());
|
| + base::SharedMemoryHandle new_handle;
|
| + bool success = MakeMachSharedMemoryHandleReadOnly(&new_handle, shm_, memory_);
|
| + if (success)
|
| + new_handle.SetOwnershipPassesToIPC(true);
|
| + return new_handle;
|
| +}
|
|
|
| - return true;
|
| +bool SharedMemory::Share(SharedMemoryHandle* new_handle) {
|
| + DCHECK(shm_.IsValid());
|
| + *new_handle = shm_.Duplicate();
|
| + return new_handle->IsValid();
|
| }
|
|
|
| bool SharedMemory::ShareToProcessCommon(ProcessHandle process,
|
| SharedMemoryHandle* new_handle,
|
| - bool close_self,
|
| - ShareMode share_mode) {
|
| - bool success = Share(new_handle, share_mode);
|
| + bool close_self) {
|
| + bool success = Share(new_handle);
|
| if (close_self) {
|
| Unmap();
|
| Close();
|
|
|