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/unsafe_shared_memory_region.h"
6
7 #include <utility>
8
9 #include "base/check_op.h"
10
11 namespace base {
12
13 UnsafeSharedMemoryRegion::CreateFunction*
14 UnsafeSharedMemoryRegion::create_hook_ = nullptr;
15
16 // static
Create(size_t size)17 UnsafeSharedMemoryRegion UnsafeSharedMemoryRegion::Create(size_t size) {
18 if (create_hook_)
19 return create_hook_(size);
20
21 subtle::PlatformSharedMemoryRegion handle =
22 subtle::PlatformSharedMemoryRegion::CreateUnsafe(size);
23
24 return UnsafeSharedMemoryRegion(std::move(handle));
25 }
26
27 // static
Deserialize(subtle::PlatformSharedMemoryRegion handle)28 UnsafeSharedMemoryRegion UnsafeSharedMemoryRegion::Deserialize(
29 subtle::PlatformSharedMemoryRegion handle) {
30 return UnsafeSharedMemoryRegion(std::move(handle));
31 }
32
33 // static
34 subtle::PlatformSharedMemoryRegion
TakeHandleForSerialization(UnsafeSharedMemoryRegion region)35 UnsafeSharedMemoryRegion::TakeHandleForSerialization(
36 UnsafeSharedMemoryRegion region) {
37 return std::move(region.handle_);
38 }
39
40 UnsafeSharedMemoryRegion::UnsafeSharedMemoryRegion() = default;
41 UnsafeSharedMemoryRegion::UnsafeSharedMemoryRegion(
42 UnsafeSharedMemoryRegion&& region) = default;
43 UnsafeSharedMemoryRegion& UnsafeSharedMemoryRegion::operator=(
44 UnsafeSharedMemoryRegion&& region) = default;
45 UnsafeSharedMemoryRegion::~UnsafeSharedMemoryRegion() = default;
46
Duplicate() const47 UnsafeSharedMemoryRegion UnsafeSharedMemoryRegion::Duplicate() const {
48 return UnsafeSharedMemoryRegion(handle_.Duplicate());
49 }
50
Map(SharedMemoryMapper * mapper) const51 WritableSharedMemoryMapping UnsafeSharedMemoryRegion::Map(
52 SharedMemoryMapper* mapper) const {
53 return MapAt(0, handle_.GetSize(), mapper);
54 }
55
MapAt(uint64_t offset,size_t size,SharedMemoryMapper * mapper) const56 WritableSharedMemoryMapping UnsafeSharedMemoryRegion::MapAt(
57 uint64_t offset,
58 size_t size,
59 SharedMemoryMapper* mapper) const {
60 if (!IsValid())
61 return {};
62
63 auto result = handle_.MapAt(offset, size, mapper);
64 if (!result.has_value())
65 return {};
66
67 return WritableSharedMemoryMapping(result.value(), size, handle_.GetGUID(),
68 mapper);
69 }
70
IsValid() const71 bool UnsafeSharedMemoryRegion::IsValid() const {
72 return handle_.IsValid();
73 }
74
UnsafeSharedMemoryRegion(subtle::PlatformSharedMemoryRegion handle)75 UnsafeSharedMemoryRegion::UnsafeSharedMemoryRegion(
76 subtle::PlatformSharedMemoryRegion handle)
77 : handle_(std::move(handle)) {
78 if (handle_.IsValid()) {
79 CHECK_EQ(handle_.GetMode(),
80 subtle::PlatformSharedMemoryRegion::Mode::kUnsafe);
81 }
82 }
83
84 } // namespace base
85