Index: base/memory/shared_memory_posix.cc |
diff --git a/base/memory/shared_memory_posix.cc b/base/memory/shared_memory_posix.cc |
index bf29e9f02a1ec5f188ef0f4ff10e12c037835bee..b483c6d8f9a1fbe82e343645e34c6ebd391a011f 100644 |
--- a/base/memory/shared_memory_posix.cc |
+++ b/base/memory/shared_memory_posix.cc |
@@ -33,22 +33,19 @@ |
namespace base { |
SharedMemory::SharedMemory() |
- : mapped_file_(-1), |
- readonly_mapped_file_(-1), |
+ : readonly_mapped_file_(-1), |
mapped_size_(0), |
memory_(NULL), |
read_only_(false), |
- requested_size_(0) { |
-} |
+ requested_size_(0) {} |
SharedMemory::SharedMemory(const SharedMemoryHandle& handle, bool read_only) |
- : mapped_file_(handle.fd), |
+ : shm_(handle), |
readonly_mapped_file_(-1), |
mapped_size_(0), |
memory_(NULL), |
read_only_(read_only), |
- requested_size_(0) { |
-} |
+ requested_size_(0) {} |
SharedMemory::~SharedMemory() { |
Unmap(); |
@@ -57,7 +54,7 @@ SharedMemory::~SharedMemory() { |
// static |
bool SharedMemory::IsHandleValid(const SharedMemoryHandle& handle) { |
- return handle.fd >= 0; |
+ return handle.IsValid(); |
} |
// static |
@@ -67,9 +64,8 @@ SharedMemoryHandle SharedMemory::NULLHandle() { |
// static |
void SharedMemory::CloseHandle(const SharedMemoryHandle& handle) { |
- DCHECK_GE(handle.fd, 0); |
- if (IGNORE_EINTR(close(handle.fd)) < 0) |
- DPLOG(ERROR) << "close"; |
+ DCHECK(handle.IsValid()); |
+ handle.Close(); |
} |
// static |
@@ -80,16 +76,13 @@ size_t SharedMemory::GetHandleLimit() { |
// 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(); |
} |
// static |
int SharedMemory::GetFdFromSharedMemoryHandle( |
const SharedMemoryHandle& handle) { |
- return handle.fd; |
+ return handle.GetHandle(); |
} |
bool SharedMemory::CreateAndMapAnonymous(size_t size) { |
@@ -102,7 +95,7 @@ bool SharedMemory::GetSizeFromSharedMemoryHandle( |
const SharedMemoryHandle& handle, |
size_t* size) { |
struct stat st; |
- if (fstat(handle.fd, &st) != 0) |
+ if (fstat(handle.GetHandle(), &st) != 0) |
return false; |
if (st.st_size < 0) |
return false; |
@@ -117,7 +110,7 @@ bool SharedMemory::GetSizeFromSharedMemoryHandle( |
// In case we want to delete it later, it may be useful to save the value |
// of mem_filename after FilePathForMemoryName(). |
bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { |
- DCHECK_EQ(-1, mapped_file_); |
+ DCHECK(!shm_.IsValid()); |
if (options.size == 0) return false; |
if (options.size > static_cast<size_t>(std::numeric_limits<int>::max())) |
@@ -219,8 +212,11 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { |
return false; |
} |
- return PrepareMapFile(std::move(fp), std::move(readonly_fd), &mapped_file_, |
- &readonly_mapped_file_); |
+ int mapped_file = -1; |
+ bool result = PrepareMapFile(std::move(fp), std::move(readonly_fd), |
+ &mapped_file, &readonly_mapped_file_); |
+ shm_ = SharedMemoryHandle::ImportHandle(mapped_file); |
+ return result; |
} |
// Our current implementation of shmem is with mmap()ing of files. |
@@ -252,13 +248,16 @@ bool SharedMemory::Open(const std::string& name, bool read_only) { |
DPLOG(ERROR) << "open(\"" << path.value() << "\", O_RDONLY) failed"; |
return false; |
} |
- return PrepareMapFile(std::move(fp), std::move(readonly_fd), &mapped_file_, |
- &readonly_mapped_file_); |
+ int mapped_file = -1; |
+ bool result = PrepareMapFile(std::move(fp), std::move(readonly_fd), |
+ &mapped_file, &readonly_mapped_file_); |
+ shm_ = SharedMemoryHandle::ImportHandle(mapped_file); |
+ return result; |
} |
#endif // !defined(OS_ANDROID) |
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())) |
@@ -272,7 +271,7 @@ bool SharedMemory::MapAt(off_t offset, size_t bytes) { |
// ashmem-determined size. |
if (bytes == 0) { |
DCHECK_EQ(0, offset); |
- int ashmem_bytes = ashmem_get_size_region(mapped_file_); |
+ int ashmem_bytes = ashmem_get_size_region(shm_.GetHandle()); |
if (ashmem_bytes < 0) |
return false; |
bytes = ashmem_bytes; |
@@ -280,7 +279,7 @@ bool SharedMemory::MapAt(off_t offset, size_t bytes) { |
#endif |
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_ != (void*)-1 && memory_ != NULL; |
if (mmap_succeeded) { |
@@ -308,22 +307,22 @@ bool SharedMemory::Unmap() { |
} |
SharedMemoryHandle SharedMemory::handle() const { |
- return FileDescriptor(mapped_file_, false); |
+ return shm_; |
} |
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 (IGNORE_EINTR(close(mapped_file_)) < 0) |
- PLOG(ERROR) << "close"; |
- mapped_file_ = -1; |
+ if (shm_.IsValid()) { |
+ shm_.Close(); |
+ shm_ = SharedMemoryHandle(); |
} |
if (readonly_mapped_file_ > 0) { |
if (IGNORE_EINTR(close(readonly_mapped_file_)) < 0) |
@@ -364,7 +363,7 @@ bool SharedMemory::ShareToProcessCommon(ProcessHandle process, |
int handle_to_dup = -1; |
switch(share_mode) { |
case SHARE_CURRENT_MODE: |
- handle_to_dup = mapped_file_; |
+ handle_to_dup = shm_.GetHandle(); |
break; |
case SHARE_READONLY: |
// We could imagine re-opening the file from /dev/fd, but that can't make |
@@ -384,8 +383,8 @@ bool SharedMemory::ShareToProcessCommon(ProcessHandle process, |
return false; |
} |
- new_handle->fd = new_fd; |
- new_handle->auto_close = true; |
+ new_handle->SetHandle(new_fd); |
+ new_handle->SetOwnershipPassesToIPC(true); |
if (close_self) { |
Unmap(); |
@@ -406,7 +405,8 @@ bool SharedMemory::GetUniqueId(SharedMemory::UniqueId* id) const { |
// crbug.com/604726#c41. |
base::ThreadRestrictions::ScopedAllowIO allow_io; |
struct stat file_stat; |
- if (HANDLE_EINTR(::fstat(static_cast<int>(handle().fd), &file_stat)) != 0) |
+ if (HANDLE_EINTR( |
+ ::fstat(static_cast<int>(handle().GetHandle()), &file_stat)) != 0) |
return false; |
id->first = file_stat.st_dev; |
id->second = file_stat.st_ino; |