• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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