/* * Copyright (c) 2021, Andreas Kling * Copyright (c) 2022, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Core { class AnonymousBufferImpl final : public RefCounted { public: static ErrorOr> create(int fd, size_t); ~AnonymousBufferImpl(); int fd() const { return m_fd; } size_t size() const { return m_size; } void* data() { return m_data; } void const* data() const { return m_data; } private: AnonymousBufferImpl(int fd, size_t, void*); int m_fd { -1 }; size_t m_size { 0 }; void* m_data { nullptr }; }; class AnonymousBuffer { public: static ErrorOr create_with_size(size_t); static ErrorOr create_from_anon_fd(int fd, size_t); AnonymousBuffer() = default; bool is_valid() const { return m_impl; } int fd() const { return m_impl ? m_impl->fd() : -1; } size_t size() const { return m_impl ? m_impl->size() : 0; } template T* data() { static_assert(IsVoid || IsTrivial); if (!m_impl) return nullptr; return (T*)m_impl->data(); } template T const* data() const { static_assert(IsVoid || IsTrivial); if (!m_impl) return nullptr; return (T const*)m_impl->data(); } private: explicit AnonymousBuffer(NonnullRefPtr); RefPtr m_impl; }; } namespace IPC { template<> ErrorOr encode(Encoder&, Core::AnonymousBuffer const&); template<> ErrorOr decode(Decoder&); }