diff options
Diffstat (limited to 'base/shared_memory_posix.cc')
-rw-r--r-- | base/shared_memory_posix.cc | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/base/shared_memory_posix.cc b/base/shared_memory_posix.cc index bd33cda..e6f81c5 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 |