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