Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Side by Side Diff: base/memory/shared_memory_android.cc

Issue 2843113002: make base::SharedMemoryHandle a class on POSIX. (Closed)
Patch Set: Fix test error. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <stddef.h> 7 #include <stddef.h>
8 #include <sys/mman.h> 8 #include <sys/mman.h>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "third_party/ashmem/ashmem.h" 11 #include "third_party/ashmem/ashmem.h"
12 12
13 namespace base { 13 namespace base {
14 14
15 // For Android, we use ashmem to implement SharedMemory. ashmem_create_region 15 // For Android, we use ashmem to implement SharedMemory. ashmem_create_region
16 // will automatically pin the region. We never explicitly call pin/unpin. When 16 // will automatically pin the region. We never explicitly call pin/unpin. When
17 // all the file descriptors from different processes associated with the region 17 // all the file descriptors from different processes associated with the region
18 // are closed, the memory buffer will go away. 18 // are closed, the memory buffer will go away.
19 19
20 bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { 20 bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
21 DCHECK_EQ(-1, mapped_file_ ); 21 DCHECK(!shm_.IsValid());
22 22
23 if (options.size > static_cast<size_t>(std::numeric_limits<int>::max())) 23 if (options.size > static_cast<size_t>(std::numeric_limits<int>::max()))
24 return false; 24 return false;
25 25
26 // "name" is just a label in ashmem. It is visible in /proc/pid/maps. 26 // "name" is just a label in ashmem. It is visible in /proc/pid/maps.
27 mapped_file_ = ashmem_create_region( 27 int fd = ashmem_create_region(
28 options.name_deprecated == NULL ? "" : options.name_deprecated->c_str(), 28 options.name_deprecated == NULL ? "" : options.name_deprecated->c_str(),
29 options.size); 29 options.size);
30 if (-1 == mapped_file_) { 30 shm_ = SharedMemoryHandle::ImportHandle(fd);
31 if (!shm_.IsValid()) {
31 DLOG(ERROR) << "Shared memory creation failed"; 32 DLOG(ERROR) << "Shared memory creation failed";
32 return false; 33 return false;
33 } 34 }
34 35
35 int err = ashmem_set_prot_region(mapped_file_, 36 int err = ashmem_set_prot_region(shm_.GetHandle(),
36 PROT_READ | PROT_WRITE | PROT_EXEC); 37 PROT_READ | PROT_WRITE | PROT_EXEC);
37 if (err < 0) { 38 if (err < 0) {
38 DLOG(ERROR) << "Error " << err << " when setting protection of ashmem"; 39 DLOG(ERROR) << "Error " << err << " when setting protection of ashmem";
39 return false; 40 return false;
40 } 41 }
41 42
42 // Android doesn't appear to have a way to drop write access on an ashmem 43 // Android doesn't appear to have a way to drop write access on an ashmem
43 // segment for a single descriptor. http://crbug.com/320865 44 // segment for a single descriptor. http://crbug.com/320865
44 readonly_mapped_file_ = dup(mapped_file_); 45 readonly_mapped_file_ = dup(shm_.GetHandle());
45 if (-1 == readonly_mapped_file_) { 46 if (-1 == readonly_mapped_file_) {
46 DPLOG(ERROR) << "dup() failed"; 47 DPLOG(ERROR) << "dup() failed";
47 return false; 48 return false;
48 } 49 }
49 50
50 requested_size_ = options.size; 51 requested_size_ = options.size;
51 52
52 return true; 53 return true;
53 } 54 }
54 55
55 bool SharedMemory::Delete(const std::string& name) { 56 bool SharedMemory::Delete(const std::string& name) {
56 // Like on Windows, this is intentionally returning true as ashmem will 57 // Like on Windows, this is intentionally returning true as ashmem will
57 // automatically releases the resource when all FDs on it are closed. 58 // automatically releases the resource when all FDs on it are closed.
58 return true; 59 return true;
59 } 60 }
60 61
61 bool SharedMemory::Open(const std::string& name, bool read_only) { 62 bool SharedMemory::Open(const std::string& name, bool read_only) {
62 // ashmem doesn't support name mapping 63 // ashmem doesn't support name mapping
63 NOTIMPLEMENTED(); 64 NOTIMPLEMENTED();
64 return false; 65 return false;
65 } 66 }
66 67
67 } // namespace base 68 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698