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