Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1906)

Unified Diff: base/memory/shared_memory_handle.h

Issue 2859843002: Add a GUID to base::SharedMemoryHandle. (Closed)
Patch Set: fix guid on android. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/memory/shared_memory_android.cc ('k') | base/memory/shared_memory_handle.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « base/memory/shared_memory_android.cc ('k') | base/memory/shared_memory_handle.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698