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 #include "base/memory/shared_memory.h" | 5 #include "base/memory/shared_memory.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <sys/mman.h> | 10 #include <sys/mman.h> |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 struct stat stat; | 279 struct stat stat; |
280 if (fstat(fileno(fp.get()), &stat) != 0) | 280 if (fstat(fileno(fp.get()), &stat) != 0) |
281 return false; | 281 return false; |
282 const size_t current_size = stat.st_size; | 282 const size_t current_size = stat.st_size; |
283 if (current_size != options.size) { | 283 if (current_size != options.size) { |
284 if (HANDLE_EINTR(ftruncate(fileno(fp.get()), options.size)) != 0) | 284 if (HANDLE_EINTR(ftruncate(fileno(fp.get()), options.size)) != 0) |
285 return false; | 285 return false; |
286 } | 286 } |
287 requested_size_ = options.size; | 287 requested_size_ = options.size; |
288 } | 288 } |
289 if (fp == NULL) { | 289 if (fp == nullptr) { |
290 PLOG(ERROR) << "Creating shared memory in " << path.value() << " failed"; | 290 PLOG(ERROR) << "Creating shared memory in " << path.value() << " failed"; |
291 FilePath dir = path.DirName(); | 291 FilePath dir = path.DirName(); |
292 if (access(dir.value().c_str(), W_OK | X_OK) < 0) { | 292 if (access(dir.value().c_str(), W_OK | X_OK) < 0) { |
293 PLOG(ERROR) << "Unable to access(W_OK|X_OK) " << dir.value(); | 293 PLOG(ERROR) << "Unable to access(W_OK|X_OK) " << dir.value(); |
294 if (dir.value() == "/dev/shm") { | 294 if (dir.value() == "/dev/shm") { |
295 LOG(FATAL) << "This is frequently caused by incorrect permissions on " | 295 LOG(FATAL) << "This is frequently caused by incorrect permissions on " |
296 << "/dev/shm. Try 'sudo chmod 1777 /dev/shm' to fix."; | 296 << "/dev/shm. Try 'sudo chmod 1777 /dev/shm' to fix."; |
297 } | 297 } |
298 } | 298 } |
299 return false; | 299 return false; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 if (IGNORE_EINTR(close(readonly_mapped_file_)) < 0) | 396 if (IGNORE_EINTR(close(readonly_mapped_file_)) < 0) |
397 PLOG(ERROR) << "close"; | 397 PLOG(ERROR) << "close"; |
398 readonly_mapped_file_ = -1; | 398 readonly_mapped_file_ = -1; |
399 } | 399 } |
400 } | 400 } |
401 | 401 |
402 #if !defined(OS_ANDROID) | 402 #if !defined(OS_ANDROID) |
403 bool SharedMemory::PrepareMapFile(ScopedFILE fp, ScopedFD readonly_fd) { | 403 bool SharedMemory::PrepareMapFile(ScopedFILE fp, ScopedFD readonly_fd) { |
404 DCHECK_EQ(-1, mapped_file_); | 404 DCHECK_EQ(-1, mapped_file_); |
405 DCHECK_EQ(-1, readonly_mapped_file_); | 405 DCHECK_EQ(-1, readonly_mapped_file_); |
406 if (fp == NULL) | 406 if (fp == nullptr) |
407 return false; | 407 return false; |
408 | 408 |
409 // This function theoretically can block on the disk, but realistically | 409 // This function theoretically can block on the disk, but realistically |
410 // the temporary files we create will just go into the buffer cache | 410 // the temporary files we create will just go into the buffer cache |
411 // and be deleted before they ever make it out to disk. | 411 // and be deleted before they ever make it out to disk. |
412 base::ThreadRestrictions::ScopedAllowIO allow_io; | 412 base::ThreadRestrictions::ScopedAllowIO allow_io; |
413 | 413 |
414 struct stat st = {}; | 414 struct stat st = {}; |
415 if (fstat(fileno(fp.get()), &st)) | 415 if (fstat(fileno(fp.get()), &st)) |
416 NOTREACHED(); | 416 NOTREACHED(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 #if defined(GOOGLE_CHROME_BUILD) | 455 #if defined(GOOGLE_CHROME_BUILD) |
456 std::string name_base = std::string("com.google.Chrome"); | 456 std::string name_base = std::string("com.google.Chrome"); |
457 #else | 457 #else |
458 std::string name_base = std::string("org.chromium.Chromium"); | 458 std::string name_base = std::string("org.chromium.Chromium"); |
459 #endif | 459 #endif |
460 *path = temp_dir.AppendASCII(name_base + ".shmem." + mem_name); | 460 *path = temp_dir.AppendASCII(name_base + ".shmem." + mem_name); |
461 return true; | 461 return true; |
462 } | 462 } |
463 #endif // !defined(OS_ANDROID) | 463 #endif // !defined(OS_ANDROID) |
464 | 464 |
465 bool SharedMemory::ShareToProcessCommon(ProcessHandle process, | 465 bool SharedMemory::ShareToProcessCommon(ProcessHandle, |
466 SharedMemoryHandle* new_handle, | 466 SharedMemoryHandle* new_handle, |
467 bool close_self, | 467 bool close_self, |
468 ShareMode share_mode) { | 468 ShareMode share_mode) { |
469 int handle_to_dup = -1; | 469 int handle_to_dup = -1; |
470 switch(share_mode) { | 470 switch(share_mode) { |
471 case SHARE_CURRENT_MODE: | 471 case SHARE_CURRENT_MODE: |
472 handle_to_dup = mapped_file_; | 472 handle_to_dup = mapped_file_; |
473 break; | 473 break; |
474 case SHARE_READONLY: | 474 case SHARE_READONLY: |
475 // We could imagine re-opening the file from /dev/fd, but that can't make | 475 // We could imagine re-opening the file from /dev/fd, but that can't make |
(...skipping 18 matching lines...) Expand all Loading... |
494 | 494 |
495 if (close_self) { | 495 if (close_self) { |
496 Unmap(); | 496 Unmap(); |
497 Close(); | 497 Close(); |
498 } | 498 } |
499 | 499 |
500 return true; | 500 return true; |
501 } | 501 } |
502 | 502 |
503 } // namespace base | 503 } // namespace base |
OLD | NEW |