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