123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // Copyright 2018 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "base/memory/read_only_shared_memory_region.h"
- #include <utility>
- #include "build/build_config.h"
- namespace base {
- ReadOnlySharedMemoryRegion::CreateFunction*
- ReadOnlySharedMemoryRegion::create_hook_ = nullptr;
- // static
- MappedReadOnlyRegion ReadOnlySharedMemoryRegion::Create(
- size_t size,
- SharedMemoryMapper* mapper) {
- if (create_hook_)
- return create_hook_(size, mapper);
- subtle::PlatformSharedMemoryRegion handle =
- subtle::PlatformSharedMemoryRegion::CreateWritable(size);
- if (!handle.IsValid())
- return {};
- auto result = handle.MapAt(0, handle.GetSize(), mapper);
- if (!result.has_value())
- return {};
- WritableSharedMemoryMapping mapping(result.value(), size, handle.GetGUID(),
- mapper);
- #if BUILDFLAG(IS_MAC)
- handle.ConvertToReadOnly(mapping.memory());
- #else
- handle.ConvertToReadOnly();
- #endif // BUILDFLAG(IS_MAC)
- ReadOnlySharedMemoryRegion region(std::move(handle));
- if (!region.IsValid() || !mapping.IsValid())
- return {};
- return {std::move(region), std::move(mapping)};
- }
- // static
- ReadOnlySharedMemoryRegion ReadOnlySharedMemoryRegion::Deserialize(
- subtle::PlatformSharedMemoryRegion handle) {
- return ReadOnlySharedMemoryRegion(std::move(handle));
- }
- // static
- subtle::PlatformSharedMemoryRegion
- ReadOnlySharedMemoryRegion::TakeHandleForSerialization(
- ReadOnlySharedMemoryRegion region) {
- return std::move(region.handle_);
- }
- ReadOnlySharedMemoryRegion::ReadOnlySharedMemoryRegion() = default;
- ReadOnlySharedMemoryRegion::ReadOnlySharedMemoryRegion(
- ReadOnlySharedMemoryRegion&& region) = default;
- ReadOnlySharedMemoryRegion& ReadOnlySharedMemoryRegion::operator=(
- ReadOnlySharedMemoryRegion&& region) = default;
- ReadOnlySharedMemoryRegion::~ReadOnlySharedMemoryRegion() = default;
- ReadOnlySharedMemoryRegion ReadOnlySharedMemoryRegion::Duplicate() const {
- return ReadOnlySharedMemoryRegion(handle_.Duplicate());
- }
- ReadOnlySharedMemoryMapping ReadOnlySharedMemoryRegion::Map(
- SharedMemoryMapper* mapper) const {
- return MapAt(0, handle_.GetSize(), mapper);
- }
- ReadOnlySharedMemoryMapping ReadOnlySharedMemoryRegion::MapAt(
- uint64_t offset,
- size_t size,
- SharedMemoryMapper* mapper) const {
- if (!IsValid())
- return {};
- auto result = handle_.MapAt(offset, size, mapper);
- if (!result.has_value())
- return {};
- return ReadOnlySharedMemoryMapping(result.value(), size, handle_.GetGUID(),
- mapper);
- }
- bool ReadOnlySharedMemoryRegion::IsValid() const {
- return handle_.IsValid();
- }
- ReadOnlySharedMemoryRegion::ReadOnlySharedMemoryRegion(
- subtle::PlatformSharedMemoryRegion handle)
- : handle_(std::move(handle)) {
- if (handle_.IsValid()) {
- CHECK_EQ(handle_.GetMode(),
- subtle::PlatformSharedMemoryRegion::Mode::kReadOnly);
- }
- }
- } // namespace base
|