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