| Index: base/memory/shared_memory_handle.h
|
| diff --git a/base/memory/shared_memory_handle.h b/base/memory/shared_memory_handle.h
|
| index 044c9c983a6c0fdc60461d9820befc61b315d172..469eba227d5e71ca93f129da491438cc5752b76b 100644
|
| --- a/base/memory/shared_memory_handle.h
|
| +++ b/base/memory/shared_memory_handle.h
|
| @@ -7,6 +7,7 @@
|
|
|
| #include <stddef.h>
|
|
|
| +#include "base/unguessable_token.h"
|
| #include "build/build_config.h"
|
|
|
| #if defined(OS_WIN)
|
| @@ -25,8 +26,12 @@
|
|
|
| namespace base {
|
|
|
| -// SharedMemoryHandle is a platform specific type which represents
|
| -// the underlying OS handle to a shared memory segment.
|
| +// SharedMemoryHandle is the smallest possible IPC-transportable "reference" to
|
| +// a shared memory OS resource. A "reference" can be consumed exactly once [by
|
| +// base::SharedMemory] to map the shared memory OS resource into the virtual
|
| +// address space of the current process.
|
| +// TODO(erikchen): This class should have strong ownership semantics to prevent
|
| +// leaks of the underlying OS resource. https://crbug.com/640840.
|
| class BASE_EXPORT SharedMemoryHandle {
|
| public:
|
| // The default constructor returns an invalid SharedMemoryHandle.
|
| @@ -61,6 +66,11 @@ class BASE_EXPORT SharedMemoryHandle {
|
| // resource.
|
| SharedMemoryHandle Duplicate() const;
|
|
|
| + // Uniques identifies the shared memory region that the underlying OS resource
|
| + // points to. Multiple SharedMemoryHandles that point to the same shared
|
| + // memory region will have the same GUID. Preserved across IPC.
|
| + base::UnguessableToken GetGUID() const;
|
| +
|
| #if defined(OS_MACOSX) && !defined(OS_IOS)
|
| enum Type {
|
| // The SharedMemoryHandle is backed by a POSIX fd.
|
| @@ -76,15 +86,23 @@ class BASE_EXPORT SharedMemoryHandle {
|
| // common for existing code to make shallow copies of SharedMemoryHandle, and
|
| // the one that is finally passed into a base::SharedMemory is the one that
|
| // "consumes" the fd.
|
| - explicit SharedMemoryHandle(const base::FileDescriptor& file_descriptor);
|
| + // |guid| uniquely identifies the shared memory region pointed to by the
|
| + // underlying OS resource. If |file_descriptor| is associated with another
|
| + // SharedMemoryHandle, the caller must pass the |guid| of that
|
| + // SharedMemoryHandle. Otherwise, the caller should generate a new
|
| + // UnguessableToken.
|
| + SharedMemoryHandle(const base::FileDescriptor& file_descriptor,
|
| + const base::UnguessableToken& guid);
|
|
|
| // Makes a Mach-based SharedMemoryHandle of the given size. On error,
|
| // subsequent calls to IsValid() return false.
|
| - explicit SharedMemoryHandle(mach_vm_size_t size);
|
| + SharedMemoryHandle(mach_vm_size_t size, const base::UnguessableToken& guid);
|
|
|
| // Makes a Mach-based SharedMemoryHandle from |memory_object|, a named entry
|
| // in the current task. The memory region has size |size|.
|
| - SharedMemoryHandle(mach_port_t memory_object, mach_vm_size_t size);
|
| + SharedMemoryHandle(mach_port_t memory_object,
|
| + mach_vm_size_t size,
|
| + const base::UnguessableToken& guid);
|
|
|
| // Exposed so that the SharedMemoryHandle can be transported between
|
| // processes.
|
| @@ -101,15 +119,21 @@ class BASE_EXPORT SharedMemoryHandle {
|
| bool MapAt(off_t offset, size_t bytes, void** memory, bool read_only);
|
| #elif defined(OS_WIN)
|
| // Takes implicit ownership of |h|.
|
| - SharedMemoryHandle(HANDLE h);
|
| -
|
| + // |guid| uniquely identifies the shared memory region pointed to by the
|
| + // underlying OS resource. If the HANDLE is associated with another
|
| + // SharedMemoryHandle, the caller must pass the |guid| of that
|
| + // SharedMemoryHandle. Otherwise, the caller should generate a new
|
| + // UnguessableToken.
|
| + SharedMemoryHandle(HANDLE h, const base::UnguessableToken& guid);
|
| HANDLE GetHandle() const;
|
| #else
|
| - // This constructor is deprecated, as it fails to propagate the GUID, which
|
| - // will be added in the near future.
|
| - // TODO(rockot): Remove this constructor once Mojo supports GUIDs.
|
| - // https://crbug.com/713763.
|
| - explicit SharedMemoryHandle(const base::FileDescriptor& file_descriptor);
|
| + // |guid| uniquely identifies the shared memory region pointed to by the
|
| + // underlying OS resource. If |file_descriptor| is associated with another
|
| + // SharedMemoryHandle, the caller must pass the |guid| of that
|
| + // SharedMemoryHandle. Otherwise, the caller should generate a new
|
| + // UnguessableToken.
|
| + SharedMemoryHandle(const base::FileDescriptor& file_descriptor,
|
| + const base::UnguessableToken& guid);
|
|
|
| // Creates a SharedMemoryHandle from an |fd| supplied from an external
|
| // service.
|
| @@ -130,9 +154,6 @@ class BASE_EXPORT SharedMemoryHandle {
|
| #if defined(OS_MACOSX) && !defined(OS_IOS)
|
| friend class SharedMemory;
|
|
|
| - // Shared code between copy constructor and operator=.
|
| - void CopyRelevantData(const SharedMemoryHandle& handle);
|
| -
|
| Type type_;
|
|
|
| // Each instance of a SharedMemoryHandle is backed either by a POSIX fd or a
|
| @@ -166,6 +187,8 @@ class BASE_EXPORT SharedMemoryHandle {
|
| #else
|
| FileDescriptor file_descriptor_;
|
| #endif
|
| +
|
| + base::UnguessableToken guid_;
|
| };
|
|
|
| } // namespace base
|
|
|