// Copyright (c) 2022 The Chromium Embedded Framework 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 "libcef/common/process_message_smr_impl.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/memory/shared_memory_mapping.h" namespace { class CefSharedMemoryRegionImpl final : public CefSharedMemoryRegion { public: CefSharedMemoryRegionImpl(base::WritableSharedMemoryMapping&& mapping) : mapping_(std::move(mapping)) {} CefSharedMemoryRegionImpl(const CefSharedMemoryRegionImpl&) = delete; CefSharedMemoryRegionImpl& operator=(const CefSharedMemoryRegionImpl&) = delete; // CefSharedMemoryRegion methods bool IsValid() override { return mapping_.IsValid(); } size_t Size() override { return IsValid() ? mapping_.size() : 0; } void* Memory() override { return mapping_.memory(); } private: base::WritableSharedMemoryMapping mapping_; IMPLEMENT_REFCOUNTING(CefSharedMemoryRegionImpl); }; } // namespace CefProcessMessageSMRImpl::CefProcessMessageSMRImpl( const CefString& name, base::WritableSharedMemoryRegion&& region) : name_(name), region_(std::move(region)) { DCHECK(!name_.empty()); DCHECK(region_.IsValid()); } CefProcessMessageSMRImpl::~CefProcessMessageSMRImpl() = default; bool CefProcessMessageSMRImpl::IsValid() { return region_.IsValid(); } CefString CefProcessMessageSMRImpl::GetName() { return name_; } CefRefPtr CefProcessMessageSMRImpl::GetSharedMemoryRegion() { return new CefSharedMemoryRegionImpl(region_.Map()); } base::WritableSharedMemoryRegion CefProcessMessageSMRImpl::TakeRegion() { return std::move(region_); } // static CefRefPtr CefSharedProcessMessageBuilder::Create(const CefString& name, size_t byte_size) { return new CefSharedProcessMessageBuilderImpl(name, byte_size); } CefSharedProcessMessageBuilderImpl::CefSharedProcessMessageBuilderImpl( const CefString& name, size_t byte_size) : name_(name), region_(base::WritableSharedMemoryRegion::Create(byte_size)), mapping_(region_.Map()) {} bool CefSharedProcessMessageBuilderImpl::IsValid() { return region_.IsValid() && mapping_.IsValid(); } size_t CefSharedProcessMessageBuilderImpl::Size() { return !IsValid() ? 0 : region_.GetSize(); } void* CefSharedProcessMessageBuilderImpl::Memory() { return !IsValid() ? nullptr : mapping_.memory(); } CefRefPtr CefSharedProcessMessageBuilderImpl::Build() { if (!IsValid()) { return nullptr; } // Invalidate mappping mapping_ = base::WritableSharedMemoryMapping(); return new CefProcessMessageSMRImpl(name_, std::move(region_)); }