| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "base/shared_memory.h" | 5 #include "base/shared_memory.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <sys/mman.h> | 9 #include <sys/mman.h> |
| 10 #include <sys/stat.h> | 10 #include <sys/stat.h> |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 } | 91 } |
| 92 | 92 |
| 93 // Chromium mostly only uses the unique/private shmem as specified by | 93 // Chromium mostly only uses the unique/private shmem as specified by |
| 94 // "name == L"". The exception is in the StatsTable. | 94 // "name == L"". The exception is in the StatsTable. |
| 95 // TODO(jrg): there is no way to "clean up" all unused named shmem if | 95 // TODO(jrg): there is no way to "clean up" all unused named shmem if |
| 96 // we restart from a crash. (That isn't a new problem, but it is a problem.) | 96 // we restart from a crash. (That isn't a new problem, but it is a problem.) |
| 97 // In case we want to delete it later, it may be useful to save the value | 97 // In case we want to delete it later, it may be useful to save the value |
| 98 // of mem_filename after FilePathForMemoryName(). | 98 // of mem_filename after FilePathForMemoryName(). |
| 99 bool SharedMemory::CreateNamed(const std::string& name, | 99 bool SharedMemory::CreateNamed(const std::string& name, |
| 100 bool open_existing, uint32 size) { | 100 bool open_existing, uint32 size) { |
| 101 DCHECK(mapped_file_ == -1); | 101 DCHECK_EQ(-1, mapped_file_); |
| 102 if (size == 0) return false; | 102 if (size == 0) return false; |
| 103 | 103 |
| 104 // This function theoretically can block on the disk, but realistically | 104 // This function theoretically can block on the disk, but realistically |
| 105 // the temporary files we create will just go into the buffer cache | 105 // the temporary files we create will just go into the buffer cache |
| 106 // and be deleted before they ever make it out to disk. | 106 // and be deleted before they ever make it out to disk. |
| 107 base::ThreadRestrictions::ScopedAllowIO allow_io; | 107 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 108 | 108 |
| 109 FILE *fp; | 109 FILE *fp; |
| 110 bool fix_size = true; | 110 bool fix_size = true; |
| 111 | 111 |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 | 236 |
| 237 void SharedMemory::Lock() { | 237 void SharedMemory::Lock() { |
| 238 LockOrUnlockCommon(F_LOCK); | 238 LockOrUnlockCommon(F_LOCK); |
| 239 } | 239 } |
| 240 | 240 |
| 241 void SharedMemory::Unlock() { | 241 void SharedMemory::Unlock() { |
| 242 LockOrUnlockCommon(F_ULOCK); | 242 LockOrUnlockCommon(F_ULOCK); |
| 243 } | 243 } |
| 244 | 244 |
| 245 bool SharedMemory::PrepareMapFile(FILE *fp) { | 245 bool SharedMemory::PrepareMapFile(FILE *fp) { |
| 246 DCHECK(mapped_file_ == -1); | 246 DCHECK_EQ(-1, mapped_file_); |
| 247 if (fp == NULL) return false; | 247 if (fp == NULL) return false; |
| 248 | 248 |
| 249 // This function theoretically can block on the disk, but realistically | 249 // This function theoretically can block on the disk, but realistically |
| 250 // the temporary files we create will just go into the buffer cache | 250 // the temporary files we create will just go into the buffer cache |
| 251 // and be deleted before they ever make it out to disk. | 251 // and be deleted before they ever make it out to disk. |
| 252 base::ThreadRestrictions::ScopedAllowIO allow_io; | 252 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 253 | 253 |
| 254 file_util::ScopedFILE file_closer(fp); | 254 file_util::ScopedFILE file_closer(fp); |
| 255 | 255 |
| 256 mapped_file_ = dup(fileno(fp)); | 256 mapped_file_ = dup(fileno(fp)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 271 return true; | 271 return true; |
| 272 } | 272 } |
| 273 | 273 |
| 274 // For the given shmem named |mem_name|, return a filename to mmap() | 274 // For the given shmem named |mem_name|, return a filename to mmap() |
| 275 // (and possibly create). Modifies |filename|. Return false on | 275 // (and possibly create). Modifies |filename|. Return false on |
| 276 // error, or true of we are happy. | 276 // error, or true of we are happy. |
| 277 bool SharedMemory::FilePathForMemoryName(const std::string& mem_name, | 277 bool SharedMemory::FilePathForMemoryName(const std::string& mem_name, |
| 278 FilePath* path) { | 278 FilePath* path) { |
| 279 // mem_name will be used for a filename; make sure it doesn't | 279 // mem_name will be used for a filename; make sure it doesn't |
| 280 // contain anything which will confuse us. | 280 // contain anything which will confuse us. |
| 281 DCHECK(mem_name.find('/') == std::string::npos); | 281 DCHECK_EQ(std::string::npos, mem_name.find('/')); |
| 282 DCHECK(mem_name.find('\0') == std::string::npos); | 282 DCHECK_EQ(std::string::npos, mem_name.find('\0')); |
| 283 | 283 |
| 284 FilePath temp_dir; | 284 FilePath temp_dir; |
| 285 if (!file_util::GetShmemTempDir(&temp_dir)) | 285 if (!file_util::GetShmemTempDir(&temp_dir)) |
| 286 return false; | 286 return false; |
| 287 | 287 |
| 288 *path = temp_dir.AppendASCII("com.google.chrome.shmem." + mem_name); | 288 *path = temp_dir.AppendASCII("com.google.chrome.shmem." + mem_name); |
| 289 return true; | 289 return true; |
| 290 } | 290 } |
| 291 | 291 |
| 292 void SharedMemory::LockOrUnlockCommon(int function) { | 292 void SharedMemory::LockOrUnlockCommon(int function) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 316 new_handle->fd = new_fd; | 316 new_handle->fd = new_fd; |
| 317 new_handle->auto_close = true; | 317 new_handle->auto_close = true; |
| 318 | 318 |
| 319 if (close_self) | 319 if (close_self) |
| 320 Close(); | 320 Close(); |
| 321 | 321 |
| 322 return true; | 322 return true; |
| 323 } | 323 } |
| 324 | 324 |
| 325 } // namespace base | 325 } // namespace base |
| OLD | NEW |