| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ | 5 #ifndef BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ |
| 6 #define BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ | 6 #define BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include "base/unguessable_token.h" |
| 10 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 11 | 12 |
| 12 #if defined(OS_WIN) | 13 #if defined(OS_WIN) |
| 13 #include <windows.h> | 14 #include <windows.h> |
| 14 #include "base/process/process_handle.h" | 15 #include "base/process/process_handle.h" |
| 15 #elif defined(OS_MACOSX) && !defined(OS_IOS) | 16 #elif defined(OS_MACOSX) && !defined(OS_IOS) |
| 16 #include <mach/mach.h> | 17 #include <mach/mach.h> |
| 17 #include "base/base_export.h" | 18 #include "base/base_export.h" |
| 18 #include "base/file_descriptor_posix.h" | 19 #include "base/file_descriptor_posix.h" |
| 19 #include "base/macros.h" | 20 #include "base/macros.h" |
| 20 #include "base/process/process_handle.h" | 21 #include "base/process/process_handle.h" |
| 21 #elif defined(OS_POSIX) | 22 #elif defined(OS_POSIX) |
| 22 #include <sys/types.h> | 23 #include <sys/types.h> |
| 23 #include "base/file_descriptor_posix.h" | 24 #include "base/file_descriptor_posix.h" |
| 24 #endif | 25 #endif |
| 25 | 26 |
| 26 namespace base { | 27 namespace base { |
| 27 | 28 |
| 28 // SharedMemoryHandle is a platform specific type which represents | 29 // SharedMemoryHandle is the smallest possible IPC-transportable "reference" to |
| 29 // the underlying OS handle to a shared memory segment. | 30 // a shared memory OS resource. A "reference" can be consumed exactly once [by |
| 31 // base::SharedMemory] to map the shared memory OS resource into the virtual |
| 32 // address space of the current process. |
| 33 // TODO(erikchen): This class should have strong ownership semantics to prevent |
| 34 // leaks of the underlying OS resource. https://crbug.com/640840. |
| 30 class BASE_EXPORT SharedMemoryHandle { | 35 class BASE_EXPORT SharedMemoryHandle { |
| 31 public: | 36 public: |
| 32 // The default constructor returns an invalid SharedMemoryHandle. | 37 // The default constructor returns an invalid SharedMemoryHandle. |
| 33 SharedMemoryHandle(); | 38 SharedMemoryHandle(); |
| 34 | 39 |
| 35 // Standard copy constructor. The new instance shares the underlying OS | 40 // Standard copy constructor. The new instance shares the underlying OS |
| 36 // primitives. | 41 // primitives. |
| 37 SharedMemoryHandle(const SharedMemoryHandle& handle); | 42 SharedMemoryHandle(const SharedMemoryHandle& handle); |
| 38 | 43 |
| 39 // Standard assignment operator. The updated instance shares the underlying | 44 // Standard assignment operator. The updated instance shares the underlying |
| (...skipping 14 matching lines...) Expand all Loading... |
| 54 bool OwnershipPassesToIPC() const; | 59 bool OwnershipPassesToIPC() const; |
| 55 | 60 |
| 56 // Whether the underlying OS resource is valid. | 61 // Whether the underlying OS resource is valid. |
| 57 bool IsValid() const; | 62 bool IsValid() const; |
| 58 | 63 |
| 59 // Duplicates the underlying OS resource. Using the return value as a | 64 // Duplicates the underlying OS resource. Using the return value as a |
| 60 // parameter to an IPC message will cause the IPC subsystem to consume the OS | 65 // parameter to an IPC message will cause the IPC subsystem to consume the OS |
| 61 // resource. | 66 // resource. |
| 62 SharedMemoryHandle Duplicate() const; | 67 SharedMemoryHandle Duplicate() const; |
| 63 | 68 |
| 69 // Uniques identifies the shared memory region that the underlying OS resource |
| 70 // points to. Multiple SharedMemoryHandles that point to the same shared |
| 71 // memory region will have the same GUID. Preserved across IPC. |
| 72 base::UnguessableToken GetGUID() const; |
| 73 |
| 64 #if defined(OS_MACOSX) && !defined(OS_IOS) | 74 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 65 enum Type { | 75 enum Type { |
| 66 // The SharedMemoryHandle is backed by a POSIX fd. | 76 // The SharedMemoryHandle is backed by a POSIX fd. |
| 67 POSIX, | 77 POSIX, |
| 68 // The SharedMemoryHandle is backed by the Mach primitive "memory object". | 78 // The SharedMemoryHandle is backed by the Mach primitive "memory object". |
| 69 MACH, | 79 MACH, |
| 70 }; | 80 }; |
| 71 | 81 |
| 72 // Constructs a SharedMemoryHandle backed by the components of a | 82 // Constructs a SharedMemoryHandle backed by the components of a |
| 73 // FileDescriptor. The newly created instance has the same ownership semantics | 83 // FileDescriptor. The newly created instance has the same ownership semantics |
| 74 // as base::FileDescriptor. This typically means that the SharedMemoryHandle | 84 // as base::FileDescriptor. This typically means that the SharedMemoryHandle |
| 75 // takes ownership of the |fd| if |auto_close| is true. Unfortunately, it's | 85 // takes ownership of the |fd| if |auto_close| is true. Unfortunately, it's |
| 76 // common for existing code to make shallow copies of SharedMemoryHandle, and | 86 // common for existing code to make shallow copies of SharedMemoryHandle, and |
| 77 // the one that is finally passed into a base::SharedMemory is the one that | 87 // the one that is finally passed into a base::SharedMemory is the one that |
| 78 // "consumes" the fd. | 88 // "consumes" the fd. |
| 79 explicit SharedMemoryHandle(const base::FileDescriptor& file_descriptor); | 89 // |guid| uniquely identifies the shared memory region pointed to by the |
| 90 // underlying OS resource. If |file_descriptor| is associated with another |
| 91 // SharedMemoryHandle, the caller must pass the |guid| of that |
| 92 // SharedMemoryHandle. Otherwise, the caller should generate a new |
| 93 // UnguessableToken. |
| 94 SharedMemoryHandle(const base::FileDescriptor& file_descriptor, |
| 95 const base::UnguessableToken& guid); |
| 80 | 96 |
| 81 // Makes a Mach-based SharedMemoryHandle of the given size. On error, | 97 // Makes a Mach-based SharedMemoryHandle of the given size. On error, |
| 82 // subsequent calls to IsValid() return false. | 98 // subsequent calls to IsValid() return false. |
| 83 explicit SharedMemoryHandle(mach_vm_size_t size); | 99 SharedMemoryHandle(mach_vm_size_t size, const base::UnguessableToken& guid); |
| 84 | 100 |
| 85 // Makes a Mach-based SharedMemoryHandle from |memory_object|, a named entry | 101 // Makes a Mach-based SharedMemoryHandle from |memory_object|, a named entry |
| 86 // in the current task. The memory region has size |size|. | 102 // in the current task. The memory region has size |size|. |
| 87 SharedMemoryHandle(mach_port_t memory_object, mach_vm_size_t size); | 103 SharedMemoryHandle(mach_port_t memory_object, |
| 104 mach_vm_size_t size, |
| 105 const base::UnguessableToken& guid); |
| 88 | 106 |
| 89 // Exposed so that the SharedMemoryHandle can be transported between | 107 // Exposed so that the SharedMemoryHandle can be transported between |
| 90 // processes. | 108 // processes. |
| 91 mach_port_t GetMemoryObject() const; | 109 mach_port_t GetMemoryObject() const; |
| 92 | 110 |
| 93 // Returns false on a failure to determine the size. On success, populates the | 111 // Returns false on a failure to determine the size. On success, populates the |
| 94 // output variable |size|. | 112 // output variable |size|. |
| 95 bool GetSize(size_t* size) const; | 113 bool GetSize(size_t* size) const; |
| 96 | 114 |
| 97 // The SharedMemoryHandle must be valid. | 115 // The SharedMemoryHandle must be valid. |
| 98 // Returns whether the SharedMemoryHandle was successfully mapped into memory. | 116 // Returns whether the SharedMemoryHandle was successfully mapped into memory. |
| 99 // On success, |memory| is an output variable that contains the start of the | 117 // On success, |memory| is an output variable that contains the start of the |
| 100 // mapped memory. | 118 // mapped memory. |
| 101 bool MapAt(off_t offset, size_t bytes, void** memory, bool read_only); | 119 bool MapAt(off_t offset, size_t bytes, void** memory, bool read_only); |
| 102 #elif defined(OS_WIN) | 120 #elif defined(OS_WIN) |
| 103 // Takes implicit ownership of |h|. | 121 // Takes implicit ownership of |h|. |
| 104 SharedMemoryHandle(HANDLE h); | 122 // |guid| uniquely identifies the shared memory region pointed to by the |
| 105 | 123 // underlying OS resource. If the HANDLE is associated with another |
| 124 // SharedMemoryHandle, the caller must pass the |guid| of that |
| 125 // SharedMemoryHandle. Otherwise, the caller should generate a new |
| 126 // UnguessableToken. |
| 127 SharedMemoryHandle(HANDLE h, const base::UnguessableToken& guid); |
| 106 HANDLE GetHandle() const; | 128 HANDLE GetHandle() const; |
| 107 #else | 129 #else |
| 108 // This constructor is deprecated, as it fails to propagate the GUID, which | 130 // |guid| uniquely identifies the shared memory region pointed to by the |
| 109 // will be added in the near future. | 131 // underlying OS resource. If |file_descriptor| is associated with another |
| 110 // TODO(rockot): Remove this constructor once Mojo supports GUIDs. | 132 // SharedMemoryHandle, the caller must pass the |guid| of that |
| 111 // https://crbug.com/713763. | 133 // SharedMemoryHandle. Otherwise, the caller should generate a new |
| 112 explicit SharedMemoryHandle(const base::FileDescriptor& file_descriptor); | 134 // UnguessableToken. |
| 135 SharedMemoryHandle(const base::FileDescriptor& file_descriptor, |
| 136 const base::UnguessableToken& guid); |
| 113 | 137 |
| 114 // Creates a SharedMemoryHandle from an |fd| supplied from an external | 138 // Creates a SharedMemoryHandle from an |fd| supplied from an external |
| 115 // service. | 139 // service. |
| 116 static SharedMemoryHandle ImportHandle(int fd); | 140 static SharedMemoryHandle ImportHandle(int fd); |
| 117 | 141 |
| 118 // Returns the underlying OS resource. | 142 // Returns the underlying OS resource. |
| 119 int GetHandle() const; | 143 int GetHandle() const; |
| 120 | 144 |
| 121 // Takes ownership of the OS resource. | 145 // Takes ownership of the OS resource. |
| 122 void SetHandle(int fd); | 146 void SetHandle(int fd); |
| 123 | 147 |
| 124 // Invalidates [but doesn't close] the underlying OS resource. This will leak | 148 // Invalidates [but doesn't close] the underlying OS resource. This will leak |
| 125 // unless the caller is careful. | 149 // unless the caller is careful. |
| 126 int Release(); | 150 int Release(); |
| 127 #endif | 151 #endif |
| 128 | 152 |
| 129 private: | 153 private: |
| 130 #if defined(OS_MACOSX) && !defined(OS_IOS) | 154 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 131 friend class SharedMemory; | 155 friend class SharedMemory; |
| 132 | 156 |
| 133 // Shared code between copy constructor and operator=. | |
| 134 void CopyRelevantData(const SharedMemoryHandle& handle); | |
| 135 | |
| 136 Type type_; | 157 Type type_; |
| 137 | 158 |
| 138 // Each instance of a SharedMemoryHandle is backed either by a POSIX fd or a | 159 // Each instance of a SharedMemoryHandle is backed either by a POSIX fd or a |
| 139 // mach port. |type_| determines the backing member. | 160 // mach port. |type_| determines the backing member. |
| 140 union { | 161 union { |
| 141 FileDescriptor file_descriptor_; | 162 FileDescriptor file_descriptor_; |
| 142 | 163 |
| 143 struct { | 164 struct { |
| 144 mach_port_t memory_object_; | 165 mach_port_t memory_object_; |
| 145 | 166 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 159 | 180 |
| 160 // Whether passing this object as a parameter to an IPC message passes | 181 // Whether passing this object as a parameter to an IPC message passes |
| 161 // ownership of |handle_| to the IPC stack. This is meant to mimic the | 182 // ownership of |handle_| to the IPC stack. This is meant to mimic the |
| 162 // behavior of the |auto_close| parameter of FileDescriptor. This member only | 183 // behavior of the |auto_close| parameter of FileDescriptor. This member only |
| 163 // affects attachment-brokered SharedMemoryHandles. | 184 // affects attachment-brokered SharedMemoryHandles. |
| 164 // Defaults to |false|. | 185 // Defaults to |false|. |
| 165 bool ownership_passes_to_ipc_; | 186 bool ownership_passes_to_ipc_; |
| 166 #else | 187 #else |
| 167 FileDescriptor file_descriptor_; | 188 FileDescriptor file_descriptor_; |
| 168 #endif | 189 #endif |
| 190 |
| 191 base::UnguessableToken guid_; |
| 169 }; | 192 }; |
| 170 | 193 |
| 171 } // namespace base | 194 } // namespace base |
| 172 | 195 |
| 173 #endif // BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ | 196 #endif // BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ |
| OLD | NEW |