/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2023 Raspberry Pi Ltd * Copyright (C) 2024 Andrei Konovalov * Copyright (C) 2024 Dennis Bonke * * shared_mem_object.h - Helpers for shared memory allocations */ #pragma once #include #include #include #include #include #include #include #include #include namespace libcamera { class SharedMem { public: SharedMem(); SharedMem(const std::string &name, std::size_t size); SharedMem(SharedMem &&rhs); virtual ~SharedMem(); SharedMem &operator=(SharedMem &&rhs); const SharedFD &fd() const { return fd_; } Span mem() const { return mem_; } explicit operator bool() const { return !mem_.empty(); } private: LIBCAMERA_DISABLE_COPY(SharedMem) SharedFD fd_; Span mem_; }; template::value>> class SharedMemObject : public SharedMem { public: static constexpr std::size_t kSize = sizeof(T); SharedMemObject() : SharedMem(), obj_(nullptr) { } template SharedMemObject(const std::string &name, Args &&...args) : SharedMem(name, kSize), obj_(nullptr) { if (mem().empty()) return; obj_ = new (mem().data()) T(std::forward(args)...); } SharedMemObject(SharedMemObject &&rhs) : SharedMem(std::move(rhs)) { this->obj_ = rhs.obj_; rhs.obj_ = nullptr; } ~SharedMemObject() { if (obj_) obj_->~T(); } SharedMemObject &operator=(SharedMemObject &&rhs) { SharedMem::operator=(std::move(rhs)); this->obj_ = rhs.obj_; rhs.obj_ = nullptr; return *this; } T *operator->() { return obj_; } const T *operator->() const { return obj_; } T &operator*() { return *obj_; } const T &operator*() const { return *obj_; } private: LIBCAMERA_DISABLE_COPY(SharedMemObject) T *obj_; }; } /* namespace libcamera */