| Index: base/shared_memory_posix.cc
|
| diff --git a/base/shared_memory_posix.cc b/base/shared_memory_posix.cc
|
| index bd33cda006d6ec08557cf2ebb8d32208e6ef86e8..e6f81c52961ce4a199fd323cf12b47fe61cd8018 100644
|
| --- a/base/shared_memory_posix.cc
|
| +++ b/base/shared_memory_posix.cc
|
| @@ -29,7 +29,7 @@ SharedMemory::SharedMemory()
|
| }
|
|
|
| SharedMemory::SharedMemory(SharedMemoryHandle handle, bool read_only)
|
| - : mapped_file_(handle),
|
| + : mapped_file_(handle.fd),
|
| memory_(NULL),
|
| read_only_(read_only),
|
| max_size_(0) {
|
| @@ -37,7 +37,7 @@ SharedMemory::SharedMemory(SharedMemoryHandle handle, bool read_only)
|
|
|
| SharedMemory::SharedMemory(SharedMemoryHandle handle, bool read_only,
|
| ProcessHandle process)
|
| - : mapped_file_(handle),
|
| + : mapped_file_(handle.fd),
|
| memory_(NULL),
|
| read_only_(read_only),
|
| max_size_(0) {
|
| @@ -50,6 +50,11 @@ SharedMemory::~SharedMemory() {
|
| Close();
|
| }
|
|
|
| +// static
|
| +bool SharedMemory::IsHandleValid(const SharedMemoryHandle& handle) {
|
| + return handle.fd >= 0;
|
| +}
|
| +
|
| bool SharedMemory::Create(const std::wstring &name, bool read_only,
|
| bool open_existing, size_t size) {
|
| read_only_ = read_only;
|
| @@ -232,10 +237,15 @@ bool SharedMemory::Unmap() {
|
| bool SharedMemory::ShareToProcessCommon(ProcessHandle process,
|
| SharedMemoryHandle *new_handle,
|
| bool close_self) {
|
| - *new_handle = 0;
|
| - // TODO(awalker): figure out if we need this, and do the appropriate
|
| - // VM magic if so.
|
| - return false;
|
| + const int new_fd = dup(mapped_file_);
|
| + DCHECK(new_fd >= -1);
|
| + new_handle->fd = new_fd;
|
| + new_handle->auto_close = true;
|
| +
|
| + if (close_self)
|
| + Close();
|
| +
|
| + return true;
|
| }
|
|
|
|
|
| @@ -277,4 +287,8 @@ void SharedMemory::Unlock() {
|
| LockOrUnlockCommon(F_ULOCK);
|
| }
|
|
|
| +SharedMemoryHandle SharedMemory::handle() const {
|
| + return FileDescriptor(mapped_file_, false);
|
| +}
|
| +
|
| } // namespace base
|
|
|