1 // Copyright 2018 The Chromium Authors. All rights reserved.
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 "base/memory/shared_memory.h"
10 #include "build/build_config.h"
11
12 namespace base {
13
14 // static
Create(size_t size)15 WritableSharedMemoryRegion WritableSharedMemoryRegion::Create(size_t size) {
16 subtle::PlatformSharedMemoryRegion handle =
17 subtle::PlatformSharedMemoryRegion::CreateWritable(size);
18
19 return WritableSharedMemoryRegion(std::move(handle));
20 }
21
22 // static
Deserialize(subtle::PlatformSharedMemoryRegion handle)23 WritableSharedMemoryRegion WritableSharedMemoryRegion::Deserialize(
24 subtle::PlatformSharedMemoryRegion handle) {
25 return WritableSharedMemoryRegion(std::move(handle));
26 }
27
28 // static
29 subtle::PlatformSharedMemoryRegion
TakeHandleForSerialization(WritableSharedMemoryRegion region)30 WritableSharedMemoryRegion::TakeHandleForSerialization(
31 WritableSharedMemoryRegion region) {
32 return std::move(region.handle_);
33 }
34
35 // static
ConvertToReadOnly(WritableSharedMemoryRegion region)36 ReadOnlySharedMemoryRegion WritableSharedMemoryRegion::ConvertToReadOnly(
37 WritableSharedMemoryRegion region) {
38 subtle::PlatformSharedMemoryRegion handle = std::move(region.handle_);
39 if (!handle.ConvertToReadOnly())
40 return {};
41
42 return ReadOnlySharedMemoryRegion::Deserialize(std::move(handle));
43 }
44
ConvertToUnsafe(WritableSharedMemoryRegion region)45 UnsafeSharedMemoryRegion WritableSharedMemoryRegion::ConvertToUnsafe(
46 WritableSharedMemoryRegion region) {
47 subtle::PlatformSharedMemoryRegion handle = std::move(region.handle_);
48 if (!handle.ConvertToUnsafe())
49 return {};
50
51 return UnsafeSharedMemoryRegion::Deserialize(std::move(handle));
52 }
53
54 WritableSharedMemoryRegion::WritableSharedMemoryRegion() = default;
55 WritableSharedMemoryRegion::WritableSharedMemoryRegion(
56 WritableSharedMemoryRegion&& region) = default;
57 WritableSharedMemoryRegion& WritableSharedMemoryRegion::operator=(
58 WritableSharedMemoryRegion&& region) = default;
59 WritableSharedMemoryRegion::~WritableSharedMemoryRegion() = default;
60
Map() const61 WritableSharedMemoryMapping WritableSharedMemoryRegion::Map() const {
62 return MapAt(0, handle_.GetSize());
63 }
64
MapAt(off_t offset,size_t size) const65 WritableSharedMemoryMapping WritableSharedMemoryRegion::MapAt(
66 off_t offset,
67 size_t size) const {
68 if (!IsValid())
69 return {};
70
71 void* memory = nullptr;
72 size_t mapped_size = 0;
73 if (!handle_.MapAt(offset, size, &memory, &mapped_size))
74 return {};
75
76 return WritableSharedMemoryMapping(memory, size, mapped_size,
77 handle_.GetGUID());
78 }
79
IsValid() const80 bool WritableSharedMemoryRegion::IsValid() const {
81 return handle_.IsValid();
82 }
83
WritableSharedMemoryRegion(subtle::PlatformSharedMemoryRegion handle)84 WritableSharedMemoryRegion::WritableSharedMemoryRegion(
85 subtle::PlatformSharedMemoryRegion handle)
86 : handle_(std::move(handle)) {
87 if (handle_.IsValid()) {
88 CHECK_EQ(handle_.GetMode(),
89 subtle::PlatformSharedMemoryRegion::Mode::kWritable);
90 }
91 }
92
93 } // namespace base
94