| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_H_ | 5 #ifndef BASE_MEMORY_SHARED_MEMORY_H_ |
| 6 #define BASE_MEMORY_SHARED_MEMORY_H_ | 6 #define BASE_MEMORY_SHARED_MEMORY_H_ |
| 7 | 7 |
| 8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 | 73 |
| 74 #if defined(OS_WIN) | 74 #if defined(OS_WIN) |
| 75 // Similar to the default constructor, except that this allows for | 75 // Similar to the default constructor, except that this allows for |
| 76 // calling Lock() to acquire the named mutex before either Create or Open | 76 // calling Lock() to acquire the named mutex before either Create or Open |
| 77 // are called on Windows. | 77 // are called on Windows. |
| 78 explicit SharedMemory(const std::wstring& name); | 78 explicit SharedMemory(const std::wstring& name); |
| 79 #endif | 79 #endif |
| 80 | 80 |
| 81 // Create a new SharedMemory object from an existing, open | 81 // Create a new SharedMemory object from an existing, open |
| 82 // shared memory file. | 82 // shared memory file. |
| 83 // |
| 84 // WARNING: This does not reduce the OS-level permissions on the handle; it |
| 85 // only affects how the SharedMemory will be mmapped. Use |
| 86 // ShareReadOnlyToProcess to drop permissions. TODO(jln,jyasskin): DCHECK |
| 87 // that |read_only| matches the permissions of the handle. |
| 83 SharedMemory(SharedMemoryHandle handle, bool read_only); | 88 SharedMemory(SharedMemoryHandle handle, bool read_only); |
| 84 | 89 |
| 85 // Create a new SharedMemory object from an existing, open | 90 // Create a new SharedMemory object from an existing, open |
| 86 // shared memory file that was created by a remote process and not shared | 91 // shared memory file that was created by a remote process and not shared |
| 87 // to the current process. | 92 // to the current process. |
| 88 SharedMemory(SharedMemoryHandle handle, bool read_only, | 93 SharedMemory(SharedMemoryHandle handle, bool read_only, |
| 89 ProcessHandle process); | 94 ProcessHandle process); |
| 90 | 95 |
| 91 // Closes any open files. | 96 // Closes any open files. |
| 92 ~SharedMemory(); | 97 ~SharedMemory(); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 // up on the same filesystem. | 189 // up on the same filesystem. |
| 185 SharedMemoryId id() const { return inode_; } | 190 SharedMemoryId id() const { return inode_; } |
| 186 #endif | 191 #endif |
| 187 | 192 |
| 188 // Closes the open shared memory segment. | 193 // Closes the open shared memory segment. |
| 189 // It is safe to call Close repeatedly. | 194 // It is safe to call Close repeatedly. |
| 190 void Close(); | 195 void Close(); |
| 191 | 196 |
| 192 // Shares the shared memory to another process. Attempts | 197 // Shares the shared memory to another process. Attempts |
| 193 // to create a platform-specific new_handle which can be | 198 // to create a platform-specific new_handle which can be |
| 199 // used in a remote process to read the shared memory |
| 200 // file. new_handle is an output parameter to receive |
| 201 // the handle for use in the remote process. |
| 202 // Returns true on success, false otherwise. |
| 203 bool ShareReadOnlyToProcess(ProcessHandle process, |
| 204 SharedMemoryHandle* new_handle) { |
| 205 return ShareToProcessCommon(process, new_handle, false, SHARE_READONLY); |
| 206 } |
| 207 |
| 208 // Logically equivalent to: |
| 209 // bool ok = ShareReadOnlyToProcess(process, new_handle); |
| 210 // Close(); |
| 211 // return ok; |
| 212 // Note that the memory is unmapped by calling this method, regardless of the |
| 213 // return value. |
| 214 bool GiveReadOnlyToProcess(ProcessHandle process, |
| 215 SharedMemoryHandle* new_handle) { |
| 216 return ShareToProcessCommon(process, new_handle, true, SHARE_READONLY); |
| 217 } |
| 218 |
| 219 // Shares the shared memory to another process. Attempts |
| 220 // to create a platform-specific new_handle which can be |
| 194 // used in a remote process to access the shared memory | 221 // used in a remote process to access the shared memory |
| 195 // file. new_handle is an ouput parameter to receive | 222 // file. new_handle is an output parameter to receive |
| 196 // the handle for use in the remote process. | 223 // the handle for use in the remote process. |
| 197 // Returns true on success, false otherwise. | 224 // Returns true on success, false otherwise. |
| 198 bool ShareToProcess(ProcessHandle process, | 225 bool ShareToProcess(ProcessHandle process, |
| 199 SharedMemoryHandle* new_handle) { | 226 SharedMemoryHandle* new_handle) { |
| 200 return ShareToProcessCommon(process, new_handle, false); | 227 return ShareToProcessCommon(process, new_handle, false, SHARE_CURRENT_MODE); |
| 201 } | 228 } |
| 202 | 229 |
| 203 // Logically equivalent to: | 230 // Logically equivalent to: |
| 204 // bool ok = ShareToProcess(process, new_handle); | 231 // bool ok = ShareToProcess(process, new_handle); |
| 205 // Close(); | 232 // Close(); |
| 206 // return ok; | 233 // return ok; |
| 207 // Note that the memory is unmapped by calling this method, regardless of the | 234 // Note that the memory is unmapped by calling this method, regardless of the |
| 208 // return value. | 235 // return value. |
| 209 bool GiveToProcess(ProcessHandle process, | 236 bool GiveToProcess(ProcessHandle process, |
| 210 SharedMemoryHandle* new_handle) { | 237 SharedMemoryHandle* new_handle) { |
| 211 return ShareToProcessCommon(process, new_handle, true); | 238 return ShareToProcessCommon(process, new_handle, true, SHARE_CURRENT_MODE); |
| 212 } | 239 } |
| 213 | 240 |
| 214 // Locks the shared memory. | 241 // Locks the shared memory. |
| 215 // | 242 // |
| 216 // WARNING: on POSIX the memory locking primitive only works across | 243 // WARNING: on POSIX the memory locking primitive only works across |
| 217 // processes, not across threads. The Lock method is not currently | 244 // processes, not across threads. The Lock method is not currently |
| 218 // used in inner loops, so we protect against multiple threads in a | 245 // used in inner loops, so we protect against multiple threads in a |
| 219 // critical section using a class global lock. | 246 // critical section using a class global lock. |
| 220 void Lock(); | 247 void Lock(); |
| 221 | 248 |
| 222 #if defined(OS_WIN) | 249 #if defined(OS_WIN) |
| 223 // A Lock() implementation with a timeout that also allows setting | 250 // A Lock() implementation with a timeout that also allows setting |
| 224 // security attributes on the mutex. sec_attr may be NULL. | 251 // security attributes on the mutex. sec_attr may be NULL. |
| 225 // Returns true if the Lock() has been acquired, false if the timeout was | 252 // Returns true if the Lock() has been acquired, false if the timeout was |
| 226 // reached. | 253 // reached. |
| 227 bool Lock(uint32 timeout_ms, SECURITY_ATTRIBUTES* sec_attr); | 254 bool Lock(uint32 timeout_ms, SECURITY_ATTRIBUTES* sec_attr); |
| 228 #endif | 255 #endif |
| 229 | 256 |
| 230 // Releases the shared memory lock. | 257 // Releases the shared memory lock. |
| 231 void Unlock(); | 258 void Unlock(); |
| 232 | 259 |
| 233 private: | 260 private: |
| 234 #if defined(OS_POSIX) && !defined(OS_NACL) | 261 #if defined(OS_POSIX) && !defined(OS_NACL) |
| 235 bool PrepareMapFile(FILE *fp); | 262 bool PrepareMapFile(FILE *fp); |
| 236 bool FilePathForMemoryName(const std::string& mem_name, FilePath* path); | 263 bool FilePathForMemoryName(const std::string& mem_name, FilePath* path); |
| 237 void LockOrUnlockCommon(int function); | 264 void LockOrUnlockCommon(int function); |
| 238 #endif | 265 #endif |
| 266 enum ShareMode { |
| 267 SHARE_READONLY, |
| 268 SHARE_CURRENT_MODE, |
| 269 }; |
| 239 bool ShareToProcessCommon(ProcessHandle process, | 270 bool ShareToProcessCommon(ProcessHandle process, |
| 240 SharedMemoryHandle* new_handle, | 271 SharedMemoryHandle* new_handle, |
| 241 bool close_self); | 272 bool close_self, |
| 273 ShareMode); |
| 242 | 274 |
| 243 #if defined(OS_WIN) | 275 #if defined(OS_WIN) |
| 244 std::wstring name_; | 276 std::wstring name_; |
| 245 HANDLE mapped_file_; | 277 HANDLE mapped_file_; |
| 246 #elif defined(OS_POSIX) | 278 #elif defined(OS_POSIX) |
| 247 int mapped_file_; | 279 int mapped_file_; |
| 248 ino_t inode_; | 280 ino_t inode_; |
| 249 #endif | 281 #endif |
| 250 size_t mapped_size_; | 282 size_t mapped_size_; |
| 251 void* memory_; | 283 void* memory_; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 272 } | 304 } |
| 273 | 305 |
| 274 private: | 306 private: |
| 275 SharedMemory* shared_memory_; | 307 SharedMemory* shared_memory_; |
| 276 DISALLOW_COPY_AND_ASSIGN(SharedMemoryAutoLock); | 308 DISALLOW_COPY_AND_ASSIGN(SharedMemoryAutoLock); |
| 277 }; | 309 }; |
| 278 | 310 |
| 279 } // namespace base | 311 } // namespace base |
| 280 | 312 |
| 281 #endif // BASE_MEMORY_SHARED_MEMORY_H_ | 313 #endif // BASE_MEMORY_SHARED_MEMORY_H_ |
| OLD | NEW |