• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/memory/writable_shared_memory_region.h"
6 
7 #include <utility>
8 
9 #include "build/build_config.h"
10 
11 namespace base {
12 
13 WritableSharedMemoryRegion::CreateFunction*
14     WritableSharedMemoryRegion::create_hook_ = nullptr;
15 
16 // static
Create(size_t size)17 WritableSharedMemoryRegion WritableSharedMemoryRegion::Create(size_t size) {
18   if (create_hook_)
19     return create_hook_(size);
20 
21   subtle::PlatformSharedMemoryRegion handle =
22       subtle::PlatformSharedMemoryRegion::CreateWritable(size);
23 
24   return WritableSharedMemoryRegion(std::move(handle));
25 }
26 
27 // static
Deserialize(subtle::PlatformSharedMemoryRegion handle)28 WritableSharedMemoryRegion WritableSharedMemoryRegion::Deserialize(
29     subtle::PlatformSharedMemoryRegion handle) {
30   return WritableSharedMemoryRegion(std::move(handle));
31 }
32 
33 // static
34 subtle::PlatformSharedMemoryRegion
TakeHandleForSerialization(WritableSharedMemoryRegion region)35 WritableSharedMemoryRegion::TakeHandleForSerialization(
36     WritableSharedMemoryRegion region) {
37   return std::move(region.handle_);
38 }
39 
40 // static
ConvertToReadOnly(WritableSharedMemoryRegion region)41 ReadOnlySharedMemoryRegion WritableSharedMemoryRegion::ConvertToReadOnly(
42     WritableSharedMemoryRegion region) {
43   subtle::PlatformSharedMemoryRegion handle = std::move(region.handle_);
44   if (!handle.ConvertToReadOnly())
45     return {};
46 
47   return ReadOnlySharedMemoryRegion::Deserialize(std::move(handle));
48 }
49 
ConvertToUnsafe(WritableSharedMemoryRegion region)50 UnsafeSharedMemoryRegion WritableSharedMemoryRegion::ConvertToUnsafe(
51     WritableSharedMemoryRegion region) {
52   subtle::PlatformSharedMemoryRegion handle = std::move(region.handle_);
53   if (!handle.ConvertToUnsafe())
54     return {};
55 
56   return UnsafeSharedMemoryRegion::Deserialize(std::move(handle));
57 }
58 
59 WritableSharedMemoryRegion::WritableSharedMemoryRegion() = default;
60 WritableSharedMemoryRegion::WritableSharedMemoryRegion(
61     WritableSharedMemoryRegion&& region) = default;
62 WritableSharedMemoryRegion& WritableSharedMemoryRegion::operator=(
63     WritableSharedMemoryRegion&& region) = default;
64 WritableSharedMemoryRegion::~WritableSharedMemoryRegion() = default;
65 
Map(SharedMemoryMapper * mapper) const66 WritableSharedMemoryMapping WritableSharedMemoryRegion::Map(
67     SharedMemoryMapper* mapper) const {
68   return MapAt(0, handle_.GetSize(), mapper);
69 }
70 
MapAt(uint64_t offset,size_t size,SharedMemoryMapper * mapper) const71 WritableSharedMemoryMapping WritableSharedMemoryRegion::MapAt(
72     uint64_t offset,
73     size_t size,
74     SharedMemoryMapper* mapper) const {
75   if (!IsValid())
76     return {};
77 
78   auto result = handle_.MapAt(offset, size, mapper);
79   if (!result.has_value())
80     return {};
81 
82   return WritableSharedMemoryMapping(result.value(), size, handle_.GetGUID(),
83                                      mapper);
84 }
85 
IsValid() const86 bool WritableSharedMemoryRegion::IsValid() const {
87   return handle_.IsValid();
88 }
89 
WritableSharedMemoryRegion(subtle::PlatformSharedMemoryRegion handle)90 WritableSharedMemoryRegion::WritableSharedMemoryRegion(
91     subtle::PlatformSharedMemoryRegion handle)
92     : handle_(std::move(handle)) {
93   if (handle_.IsValid()) {
94     CHECK_EQ(handle_.GetMode(),
95              subtle::PlatformSharedMemoryRegion::Mode::kWritable);
96   }
97 }
98 
99 }  // namespace base
100