Chromium Code Reviews| 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 "base/unguessable_token.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 // Duplicates the underlying OS resource. Using the return value as a | 64 // Duplicates the underlying OS resource. Using the return value as a |
| 65 // 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 |
| 66 // resource. | 66 // resource. |
| 67 SharedMemoryHandle Duplicate() const; | 67 SharedMemoryHandle Duplicate() const; |
| 68 | 68 |
| 69 // Uniques identifies the shared memory region that the underlying OS resource | 69 // Uniques identifies the shared memory region that the underlying OS resource |
| 70 // points to. Multiple SharedMemoryHandles that point to the same shared | 70 // points to. Multiple SharedMemoryHandles that point to the same shared |
| 71 // memory region will have the same GUID. Preserved across IPC. | 71 // memory region will have the same GUID. Preserved across IPC. |
| 72 base::UnguessableToken GetGUID() const; | 72 base::UnguessableToken GetGUID() const; |
| 73 | 73 |
| 74 // Returns false on a failure to determine the size. On success, populates the | |
| 75 // output variable |size|. | |
|
Nico
2017/05/15 22:13:36
What?
erikchen
2017/05/15 22:57:18
Updated comment.
| |
| 76 size_t GetSize() const; | |
| 77 | |
| 74 #if defined(OS_MACOSX) && !defined(OS_IOS) | 78 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 75 enum Type { | 79 enum Type { |
| 76 // The SharedMemoryHandle is backed by a POSIX fd. | 80 // The SharedMemoryHandle is backed by a POSIX fd. |
| 77 POSIX, | 81 POSIX, |
| 78 // The SharedMemoryHandle is backed by the Mach primitive "memory object". | 82 // The SharedMemoryHandle is backed by the Mach primitive "memory object". |
| 79 MACH, | 83 MACH, |
| 80 }; | 84 }; |
| 81 | 85 |
| 82 // Constructs a SharedMemoryHandle backed by the components of a | 86 // Constructs a SharedMemoryHandle backed by the components of a |
| 83 // FileDescriptor. The newly created instance has the same ownership semantics | 87 // FileDescriptor. The newly created instance has the same ownership semantics |
| 84 // as base::FileDescriptor. This typically means that the SharedMemoryHandle | 88 // as base::FileDescriptor. This typically means that the SharedMemoryHandle |
| 85 // takes ownership of the |fd| if |auto_close| is true. Unfortunately, it's | 89 // takes ownership of the |fd| if |auto_close| is true. Unfortunately, it's |
| 86 // common for existing code to make shallow copies of SharedMemoryHandle, and | 90 // common for existing code to make shallow copies of SharedMemoryHandle, and |
| 87 // the one that is finally passed into a base::SharedMemory is the one that | 91 // the one that is finally passed into a base::SharedMemory is the one that |
| 88 // "consumes" the fd. | 92 // "consumes" the fd. |
| 89 // |guid| uniquely identifies the shared memory region pointed to by the | 93 // |guid| uniquely identifies the shared memory region pointed to by the |
| 90 // underlying OS resource. If |file_descriptor| is associated with another | 94 // underlying OS resource. If |file_descriptor| is associated with another |
| 91 // SharedMemoryHandle, the caller must pass the |guid| of that | 95 // SharedMemoryHandle, the caller must pass the |guid| of that |
| 92 // SharedMemoryHandle. Otherwise, the caller should generate a new | 96 // SharedMemoryHandle. Otherwise, the caller should generate a new |
| 93 // UnguessableToken. | 97 // UnguessableToken. |
|
Nico
2017/05/15 22:13:36
Document size and what happens if the passed-in si
erikchen
2017/05/15 22:57:18
Done.
| |
| 94 SharedMemoryHandle(const base::FileDescriptor& file_descriptor, | 98 SharedMemoryHandle(const base::FileDescriptor& file_descriptor, |
| 99 size_t size, | |
| 95 const base::UnguessableToken& guid); | 100 const base::UnguessableToken& guid); |
| 96 | 101 |
| 97 // Makes a Mach-based SharedMemoryHandle of the given size. On error, | 102 // Makes a Mach-based SharedMemoryHandle of the given size. On error, |
| 98 // subsequent calls to IsValid() return false. | 103 // subsequent calls to IsValid() return false. |
| 99 SharedMemoryHandle(mach_vm_size_t size, const base::UnguessableToken& guid); | 104 SharedMemoryHandle(mach_vm_size_t size, const base::UnguessableToken& guid); |
| 100 | 105 |
| 101 // Makes a Mach-based SharedMemoryHandle from |memory_object|, a named entry | 106 // Makes a Mach-based SharedMemoryHandle from |memory_object|, a named entry |
| 102 // in the current task. The memory region has size |size|. | 107 // in the current task. The memory region has size |size|. |
| 103 SharedMemoryHandle(mach_port_t memory_object, | 108 SharedMemoryHandle(mach_port_t memory_object, |
| 104 mach_vm_size_t size, | 109 mach_vm_size_t size, |
| 105 const base::UnguessableToken& guid); | 110 const base::UnguessableToken& guid); |
| 106 | 111 |
| 107 // Exposed so that the SharedMemoryHandle can be transported between | 112 // Exposed so that the SharedMemoryHandle can be transported between |
| 108 // processes. | 113 // processes. |
| 109 mach_port_t GetMemoryObject() const; | 114 mach_port_t GetMemoryObject() const; |
| 110 | 115 |
| 111 // Returns false on a failure to determine the size. On success, populates the | |
| 112 // output variable |size|. | |
| 113 bool GetSize(size_t* size) const; | |
| 114 | |
| 115 // The SharedMemoryHandle must be valid. | 116 // The SharedMemoryHandle must be valid. |
| 116 // Returns whether the SharedMemoryHandle was successfully mapped into memory. | 117 // Returns whether the SharedMemoryHandle was successfully mapped into memory. |
| 117 // On success, |memory| is an output variable that contains the start of the | 118 // On success, |memory| is an output variable that contains the start of the |
| 118 // mapped memory. | 119 // mapped memory. |
| 119 bool MapAt(off_t offset, size_t bytes, void** memory, bool read_only); | 120 bool MapAt(off_t offset, size_t bytes, void** memory, bool read_only); |
| 120 #elif defined(OS_WIN) | 121 #elif defined(OS_WIN) |
| 121 // Takes implicit ownership of |h|. | 122 // Takes implicit ownership of |h|. |
| 122 // |guid| uniquely identifies the shared memory region pointed to by the | 123 // |guid| uniquely identifies the shared memory region pointed to by the |
| 123 // underlying OS resource. If the HANDLE is associated with another | 124 // underlying OS resource. If the HANDLE is associated with another |
| 124 // SharedMemoryHandle, the caller must pass the |guid| of that | 125 // SharedMemoryHandle, the caller must pass the |guid| of that |
| 125 // SharedMemoryHandle. Otherwise, the caller should generate a new | 126 // SharedMemoryHandle. Otherwise, the caller should generate a new |
| 126 // UnguessableToken. | 127 // UnguessableToken. |
| 127 SharedMemoryHandle(HANDLE h, const base::UnguessableToken& guid); | 128 SharedMemoryHandle(HANDLE h, size_t size, const base::UnguessableToken& guid); |
| 128 HANDLE GetHandle() const; | 129 HANDLE GetHandle() const; |
| 129 #else | 130 #else |
| 130 // |guid| uniquely identifies the shared memory region pointed to by the | 131 // |guid| uniquely identifies the shared memory region pointed to by the |
| 131 // underlying OS resource. If |file_descriptor| is associated with another | 132 // underlying OS resource. If |file_descriptor| is associated with another |
| 132 // SharedMemoryHandle, the caller must pass the |guid| of that | 133 // SharedMemoryHandle, the caller must pass the |guid| of that |
| 133 // SharedMemoryHandle. Otherwise, the caller should generate a new | 134 // SharedMemoryHandle. Otherwise, the caller should generate a new |
| 134 // UnguessableToken. | 135 // UnguessableToken. |
| 135 SharedMemoryHandle(const base::FileDescriptor& file_descriptor, | 136 SharedMemoryHandle(const base::FileDescriptor& file_descriptor, |
| 137 size_t size, | |
| 136 const base::UnguessableToken& guid); | 138 const base::UnguessableToken& guid); |
| 137 | 139 |
| 138 // Creates a SharedMemoryHandle from an |fd| supplied from an external | 140 // Creates a SharedMemoryHandle from an |fd| supplied from an external |
| 139 // service. | 141 // service. |
| 140 static SharedMemoryHandle ImportHandle(int fd); | 142 static SharedMemoryHandle ImportHandle(int fd, size_t size); |
| 141 | 143 |
| 142 // Returns the underlying OS resource. | 144 // Returns the underlying OS resource. |
| 143 int GetHandle() const; | 145 int GetHandle() const; |
| 144 | 146 |
| 145 // Takes ownership of the OS resource. | |
| 146 void SetHandle(int fd); | |
| 147 | |
| 148 // Invalidates [but doesn't close] the underlying OS resource. This will leak | 147 // Invalidates [but doesn't close] the underlying OS resource. This will leak |
| 149 // unless the caller is careful. | 148 // unless the caller is careful. |
| 150 int Release(); | 149 int Release(); |
| 151 #endif | 150 #endif |
| 152 | 151 |
| 153 private: | 152 private: |
| 154 #if defined(OS_MACOSX) && !defined(OS_IOS) | 153 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 155 friend class SharedMemory; | 154 friend class SharedMemory; |
| 156 | 155 |
| 157 Type type_; | 156 Type type_; |
| 158 | 157 |
| 159 // Each instance of a SharedMemoryHandle is backed either by a POSIX fd or a | 158 // Each instance of a SharedMemoryHandle is backed either by a POSIX fd or a |
| 160 // mach port. |type_| determines the backing member. | 159 // mach port. |type_| determines the backing member. |
| 161 union { | 160 union { |
| 162 FileDescriptor file_descriptor_; | 161 FileDescriptor file_descriptor_; |
| 163 | 162 |
| 164 struct { | 163 struct { |
| 165 mach_port_t memory_object_; | 164 mach_port_t memory_object_; |
| 166 | 165 |
| 167 // The size of the shared memory region when |type_| is MACH. Only | |
| 168 // relevant if |memory_object_| is not |MACH_PORT_NULL|. | |
| 169 mach_vm_size_t size_; | |
| 170 | |
| 171 // Whether passing this object as a parameter to an IPC message passes | 166 // Whether passing this object as a parameter to an IPC message passes |
| 172 // ownership of |memory_object_| to the IPC stack. This is meant to mimic | 167 // ownership of |memory_object_| to the IPC stack. This is meant to mimic |
| 173 // the behavior of the |auto_close| parameter of FileDescriptor. | 168 // the behavior of the |auto_close| parameter of FileDescriptor. |
| 174 // Defaults to |false|. | 169 // Defaults to |false|. |
| 175 bool ownership_passes_to_ipc_; | 170 bool ownership_passes_to_ipc_; |
| 176 }; | 171 }; |
| 177 }; | 172 }; |
| 178 #elif defined(OS_WIN) | 173 #elif defined(OS_WIN) |
| 179 HANDLE handle_; | 174 HANDLE handle_; |
| 180 | 175 |
| 181 // Whether passing this object as a parameter to an IPC message passes | 176 // Whether passing this object as a parameter to an IPC message passes |
| 182 // ownership of |handle_| to the IPC stack. This is meant to mimic the | 177 // ownership of |handle_| to the IPC stack. This is meant to mimic the |
| 183 // behavior of the |auto_close| parameter of FileDescriptor. This member only | 178 // behavior of the |auto_close| parameter of FileDescriptor. This member only |
| 184 // affects attachment-brokered SharedMemoryHandles. | 179 // affects attachment-brokered SharedMemoryHandles. |
| 185 // Defaults to |false|. | 180 // Defaults to |false|. |
| 186 bool ownership_passes_to_ipc_; | 181 bool ownership_passes_to_ipc_; |
| 187 #else | 182 #else |
| 188 FileDescriptor file_descriptor_; | 183 FileDescriptor file_descriptor_; |
| 189 #endif | 184 #endif |
| 190 | 185 |
| 191 base::UnguessableToken guid_; | 186 base::UnguessableToken guid_; |
| 187 | |
| 188 // The size of the region referenced by the SharedMemoryHandle. | |
| 189 size_t size_ = 0; | |
|
Nico
2017/05/15 22:13:36
Either use in-class initialization for all fields
erikchen
2017/05/15 22:57:18
all of them, it is.
| |
| 192 }; | 190 }; |
| 193 | 191 |
| 194 } // namespace base | 192 } // namespace base |
| 195 | 193 |
| 196 #endif // BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ | 194 #endif // BASE_MEMORY_SHARED_MEMORY_HANDLE_H_ |
| OLD | NEW |