Index: base/memory/shared_memory_nacl.cc |
diff --git a/base/memory/shared_memory_nacl.cc b/base/memory/shared_memory_nacl.cc |
index 945fc61375a901187ced95dbc5ece779e479c4cf..74d3fcad48863d645ff5317f027fa1b1264d5687 100644 |
--- a/base/memory/shared_memory_nacl.cc |
+++ b/base/memory/shared_memory_nacl.cc |
@@ -18,20 +18,14 @@ |
namespace base { |
SharedMemory::SharedMemory() |
- : 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) |
- : mapped_file_(handle.fd), |
+ : shm_(handle), |
mapped_size_(0), |
memory_(NULL), |
read_only_(read_only), |
- requested_size_(0) { |
-} |
+ requested_size_(0) {} |
SharedMemory::~SharedMemory() { |
Unmap(); |
@@ -40,7 +34,7 @@ SharedMemory::~SharedMemory() { |
// static |
bool SharedMemory::IsHandleValid(const SharedMemoryHandle& handle) { |
- return handle.fd >= 0; |
+ return handle.IsValid(); |
} |
// static |
@@ -50,18 +44,14 @@ SharedMemoryHandle SharedMemory::NULLHandle() { |
// static |
void SharedMemory::CloseHandle(const SharedMemoryHandle& handle) { |
- DCHECK_GE(handle.fd, 0); |
- if (close(handle.fd) < 0) |
- DPLOG(ERROR) << "close"; |
+ DCHECK(handle.IsValid()); |
+ handle.Close(); |
} |
// static |
SharedMemoryHandle SharedMemory::DuplicateHandle( |
const SharedMemoryHandle& handle) { |
- int duped_handle = HANDLE_EINTR(dup(handle.fd)); |
- if (duped_handle < 0) |
- return base::SharedMemory::NULLHandle(); |
- return base::FileDescriptor(duped_handle, true); |
+ return handle.Duplicate(); |
} |
bool SharedMemory::CreateAndMapAnonymous(size_t size) { |
@@ -83,7 +73,7 @@ bool SharedMemory::Open(const std::string& name, bool read_only) { |
} |
bool SharedMemory::MapAt(off_t offset, size_t bytes) { |
- if (mapped_file_ == -1) |
+ if (!shm_.IsValid()) |
return false; |
if (bytes > static_cast<size_t>(std::numeric_limits<int>::max())) |
@@ -93,7 +83,7 @@ bool SharedMemory::MapAt(off_t offset, size_t bytes) { |
return false; |
memory_ = mmap(NULL, bytes, PROT_READ | (read_only_ ? 0 : PROT_WRITE), |
- MAP_SHARED, mapped_file_, offset); |
+ MAP_SHARED, shm_.GetHandle(), offset); |
bool mmap_succeeded = memory_ != MAP_FAILED && memory_ != NULL; |
if (mmap_succeeded) { |
@@ -119,22 +109,24 @@ bool SharedMemory::Unmap() { |
} |
SharedMemoryHandle SharedMemory::handle() const { |
- return FileDescriptor(mapped_file_, false); |
+ SharedMemoryHandle handle_copy = shm_; |
+ handle_copy.SetOwnershipPassesToIPC(false); |
+ return handle_copy; |
} |
SharedMemoryHandle SharedMemory::TakeHandle() { |
- FileDescriptor handle(mapped_file_, true); |
- mapped_file_ = -1; |
+ SharedMemoryHandle handle_copy = shm_; |
+ handle_copy.SetOwnershipPassesToIPC(true); |
+ shm_ = SharedMemoryHandle(); |
memory_ = nullptr; |
mapped_size_ = 0; |
- return handle; |
+ return handle_copy; |
} |
void SharedMemory::Close() { |
- if (mapped_file_ > 0) { |
- if (close(mapped_file_) < 0) |
- DPLOG(ERROR) << "close"; |
- mapped_file_ = -1; |
+ if (shm_.IsValid()) { |
+ shm_.Close(); |
+ shm_ = SharedMemoryHandle(); |
} |
} |
@@ -147,20 +139,14 @@ bool SharedMemory::ShareToProcessCommon(ProcessHandle process, |
// drop permissions. |
return false; |
} |
- const int new_fd = dup(mapped_file_); |
- if (new_fd < 0) { |
- DPLOG(ERROR) << "dup() failed."; |
- return false; |
- } |
- new_handle->fd = new_fd; |
- new_handle->auto_close = true; |
+ *new_handle = shm_.Duplicate(); |
if (close_self) { |
Unmap(); |
Close(); |
} |
- return true; |
+ return new_handle->IsValid(); |
} |
} // namespace base |