/* * Copyright (c) 2026, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #if defined(AK_OS_MACOS) # include #endif namespace IPC { class ReceivedMessageBytes::Impl final : public RefCounted { public: explicit Impl(Vector bytes) : m_storage_type(StorageType::Vector) , m_vector(move(bytes)) { } #if defined(AK_OS_MACOS) Impl(void* vm_region_address, size_t vm_region_size) : m_storage_type(StorageType::VMRegion) , m_vm_region_address(vm_region_address) , m_vm_region_size(vm_region_size) { } #endif ~Impl() { #if defined(AK_OS_MACOS) if (m_storage_type == StorageType::VMRegion && m_vm_region_size > 0) vm_deallocate(mach_task_self(), reinterpret_cast(m_vm_region_address), m_vm_region_size); #endif } ReadonlyBytes bytes() const { switch (m_storage_type) { case StorageType::Vector: return m_vector; case StorageType::VMRegion: return { static_cast(m_vm_region_address), m_vm_region_size }; } VERIFY_NOT_REACHED(); } private: enum class StorageType { Vector, VMRegion, }; StorageType m_storage_type { StorageType::Vector }; Vector m_vector; void* m_vm_region_address { nullptr }; size_t m_vm_region_size { 0 }; }; ReceivedMessageBytes::ReceivedMessageBytes() = default; ReceivedMessageBytes::ReceivedMessageBytes(ReceivedMessageBytes const&) = default; ReceivedMessageBytes::ReceivedMessageBytes(ReceivedMessageBytes&&) = default; ReceivedMessageBytes::~ReceivedMessageBytes() = default; ReceivedMessageBytes& ReceivedMessageBytes::operator=(ReceivedMessageBytes const&) = default; ReceivedMessageBytes& ReceivedMessageBytes::operator=(ReceivedMessageBytes&&) = default; ReceivedMessageBytes::ReceivedMessageBytes(NonnullRefPtr impl) : m_impl(move(impl)) { } ReceivedMessageBytes ReceivedMessageBytes::from_vector(Vector bytes) { if (bytes.is_empty()) return {}; return ReceivedMessageBytes { adopt_ref(*new Impl(move(bytes))) }; } #if defined(AK_OS_MACOS) ReceivedMessageBytes ReceivedMessageBytes::adopt_vm_region(void* address, size_t size) { if (size == 0) return {}; return ReceivedMessageBytes { adopt_ref(*new Impl(address, size)) }; } #endif ReadonlyBytes ReceivedMessageBytes::bytes() const { if (!m_impl) return {}; return m_impl->bytes(); } }