| Index: base/memory/shared_memory_posix.cc
|
| diff --git a/base/memory/shared_memory_posix.cc b/base/memory/shared_memory_posix.cc
|
| index 2032e26e8d80c82e4428de4f9f8ff334d505ec89..8b6ed09bb54bcbaad0b178d265f066d86abd31e6 100644
|
| --- a/base/memory/shared_memory_posix.cc
|
| +++ b/base/memory/shared_memory_posix.cc
|
| @@ -33,15 +33,11 @@
|
| namespace base {
|
|
|
| SharedMemory::SharedMemory()
|
| - : readonly_mapped_file_(-1),
|
| - mapped_size_(0),
|
| - memory_(NULL),
|
| - read_only_(false),
|
| - requested_size_(0) {}
|
| + : mapped_size_(0), memory_(NULL), read_only_(false), requested_size_(0) {}
|
|
|
| SharedMemory::SharedMemory(const SharedMemoryHandle& handle, bool read_only)
|
| : shm_(handle),
|
| - readonly_mapped_file_(-1),
|
| +
|
| mapped_size_(0),
|
| memory_(NULL),
|
| read_only_(read_only),
|
| @@ -173,7 +169,7 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
|
| }
|
|
|
| if (options.share_read_only) {
|
| - // Also open as readonly so that we can ShareReadOnlyToProcess.
|
| + // Also open as readonly so that we can GetReadOnlyHandle.
|
| readonly_fd.reset(HANDLE_EINTR(open(path.value().c_str(), O_RDONLY)));
|
| if (!readonly_fd.is_valid()) {
|
| DPLOG(ERROR) << "open(\"" << path.value() << "\", O_RDONLY) failed";
|
| @@ -213,9 +209,11 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
|
| }
|
|
|
| int mapped_file = -1;
|
| + int readonly_mapped_file = -1;
|
| bool result = PrepareMapFile(std::move(fp), std::move(readonly_fd),
|
| - &mapped_file, &readonly_mapped_file_);
|
| + &mapped_file, &readonly_mapped_file);
|
| shm_ = SharedMemoryHandle::ImportHandle(mapped_file);
|
| + readonly_shm_ = SharedMemoryHandle::ImportHandle(readonly_mapped_file);
|
| return result;
|
| }
|
|
|
| @@ -249,9 +247,11 @@ bool SharedMemory::Open(const std::string& name, bool read_only) {
|
| return false;
|
| }
|
| int mapped_file = -1;
|
| + int readonly_mapped_file = -1;
|
| bool result = PrepareMapFile(std::move(fp), std::move(readonly_fd),
|
| - &mapped_file, &readonly_mapped_file_);
|
| + &mapped_file, &readonly_mapped_file);
|
| shm_ = SharedMemoryHandle::ImportHandle(mapped_file);
|
| + readonly_shm_ = SharedMemoryHandle::ImportHandle(readonly_mapped_file);
|
| return result;
|
| }
|
| #endif // !defined(OS_ANDROID)
|
| @@ -324,10 +324,9 @@ void SharedMemory::Close() {
|
| shm_.Close();
|
| shm_ = SharedMemoryHandle();
|
| }
|
| - 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();
|
| }
|
| }
|
|
|
| @@ -356,42 +355,20 @@ bool SharedMemory::FilePathForMemoryName(const std::string& mem_name,
|
| }
|
| #endif // !defined(OS_ANDROID)
|
|
|
| +SharedMemoryHandle SharedMemory::GetReadOnlyHandle() {
|
| + CHECK(readonly_shm_.IsValid());
|
| + return readonly_shm_.Duplicate();
|
| +}
|
| +
|
| bool SharedMemory::ShareToProcessCommon(ProcessHandle process,
|
| SharedMemoryHandle* new_handle,
|
| - bool close_self,
|
| - ShareMode share_mode) {
|
| - int handle_to_dup = -1;
|
| - switch(share_mode) {
|
| - case SHARE_CURRENT_MODE:
|
| - handle_to_dup = shm_.GetHandle();
|
| - 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) {
|
| - if (close_self) {
|
| - Unmap();
|
| - Close();
|
| - }
|
| - DPLOG(ERROR) << "dup() failed.";
|
| - return false;
|
| - }
|
| -
|
| - new_handle->SetHandle(new_fd);
|
| - new_handle->SetOwnershipPassesToIPC(true);
|
| -
|
| + bool close_self) {
|
| + *new_handle = shm_.Duplicate();
|
| if (close_self) {
|
| Unmap();
|
| Close();
|
| }
|
| -
|
| - return true;
|
| + return new_handle->IsValid();
|
| }
|
|
|
| bool SharedMemory::GetUniqueId(SharedMemory::UniqueId* id) const {
|
|
|