about summary refs log tree commit diff
path: root/users/flokli/ipu6-softisp/libcamera/0005-libcamera-shared_mem_object-reorganize-the-code-and-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'users/flokli/ipu6-softisp/libcamera/0005-libcamera-shared_mem_object-reorganize-the-code-and-.patch')
-rw-r--r--users/flokli/ipu6-softisp/libcamera/0005-libcamera-shared_mem_object-reorganize-the-code-and-.patch403
1 files changed, 403 insertions, 0 deletions
diff --git a/users/flokli/ipu6-softisp/libcamera/0005-libcamera-shared_mem_object-reorganize-the-code-and-.patch b/users/flokli/ipu6-softisp/libcamera/0005-libcamera-shared_mem_object-reorganize-the-code-and-.patch
new file mode 100644
index 0000000000..d2143febf7
--- /dev/null
+++ b/users/flokli/ipu6-softisp/libcamera/0005-libcamera-shared_mem_object-reorganize-the-code-and-.patch
@@ -0,0 +1,403 @@
+From f94af21adc1889706127d07c5425f44c9cec9a95 Mon Sep 17 00:00:00 2001
+From: Andrei Konovalov <andrey.konovalov.ynk@gmail.com>
+Date: Mon, 11 Mar 2024 15:15:09 +0100
+Subject: [PATCH 05/21] libcamera: shared_mem_object: reorganize the code and
+ document the SharedMemObject class
+
+Split the parts which doesn't otherwise depend on the type T or
+arguments Args out of the SharedMemObject class into a new
+SharedMem class.
+
+Doxygen documentation by Dennis Bonke and Andrei Konovalov.
+
+Reviewed-by: Pavel Machek <pavel@ucw.cz>
+Co-developed-by: Dennis Bonke <admin@dennisbonke.com>
+Signed-off-by: Dennis Bonke <admin@dennisbonke.com>
+Signed-off-by: Andrei Konovalov <andrey.konovalov.ynk@gmail.com>
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
+---
+ .../libcamera/internal/shared_mem_object.h    | 101 ++++++----
+ src/libcamera/meson.build                     |   1 +
+ src/libcamera/shared_mem_object.cpp           | 190 ++++++++++++++++++
+ 3 files changed, 253 insertions(+), 39 deletions(-)
+ create mode 100644 src/libcamera/shared_mem_object.cpp
+
+diff --git a/include/libcamera/internal/shared_mem_object.h b/include/libcamera/internal/shared_mem_object.h
+index 98636b44..43b07c9d 100644
+--- a/include/libcamera/internal/shared_mem_object.h
++++ b/include/libcamera/internal/shared_mem_object.h
+@@ -6,12 +6,9 @@
+  */
+ #pragma once
+ 
+-#include <fcntl.h>
+ #include <stddef.h>
+ #include <string>
+ #include <sys/mman.h>
+-#include <sys/stat.h>
+-#include <unistd.h>
+ #include <utility>
+ 
+ #include <libcamera/base/class.h>
+@@ -19,58 +16,92 @@
+ 
+ namespace libcamera {
+ 
++class SharedMem
++{
++public:
++	SharedMem()
++		: mem_(nullptr)
++	{
++	}
++
++	SharedMem(const std::string &name, std::size_t size);
++
++	SharedMem(SharedMem &&rhs)
++	{
++		this->name_ = std::move(rhs.name_);
++		this->fd_ = std::move(rhs.fd_);
++		this->mem_ = rhs.mem_;
++		rhs.mem_ = nullptr;
++	}
++
++	virtual ~SharedMem()
++	{
++		if (mem_)
++			munmap(mem_, size_);
++	}
++
++	/* Make SharedMem non-copyable for now. */
++	LIBCAMERA_DISABLE_COPY(SharedMem)
++
++	SharedMem &operator=(SharedMem &&rhs)
++	{
++		this->name_ = std::move(rhs.name_);
++		this->fd_ = std::move(rhs.fd_);
++		this->mem_ = rhs.mem_;
++		rhs.mem_ = nullptr;
++		return *this;
++	}
++
++	const SharedFD &fd() const
++	{
++		return fd_;
++	}
++
++	void *mem() const
++	{
++		return mem_;
++	}
++
++private:
++	std::string name_;
++	SharedFD fd_;
++	size_t size_;
++protected:
++	void *mem_;
++};
++
+ template<class T>
+-class SharedMemObject
++class SharedMemObject : public SharedMem
+ {
+ public:
+ 	static constexpr std::size_t SIZE = sizeof(T);
+ 
+ 	SharedMemObject()
+-		: obj_(nullptr)
++		: SharedMem(), obj_(nullptr)
+ 	{
+ 	}
+ 
+ 	template<class... Args>
+ 	SharedMemObject(const std::string &name, Args &&...args)
+-		: name_(name), obj_(nullptr)
++		: SharedMem(name, SIZE), obj_(nullptr)
+ 	{
+-		void *mem;
+-		int ret;
+-
+-		ret = memfd_create(name_.c_str(), MFD_CLOEXEC);
+-		if (ret < 0)
+-			return;
+-
+-		fd_ = SharedFD(std::move(ret));
+-		if (!fd_.isValid())
+-			return;
+-
+-		ret = ftruncate(fd_.get(), SIZE);
+-		if (ret < 0)
++		if (mem_ == nullptr)
+ 			return;
+ 
+-		mem = mmap(nullptr, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
+-			   fd_.get(), 0);
+-		if (mem == MAP_FAILED)
+-			return;
+-
+-		obj_ = new (mem) T(std::forward<Args>(args)...);
++		obj_ = new (mem_) T(std::forward<Args>(args)...);
+ 	}
+ 
+ 	SharedMemObject(SharedMemObject<T> &&rhs)
++		: SharedMem(std::move(rhs))
+ 	{
+-		this->name_ = std::move(rhs.name_);
+-		this->fd_ = std::move(rhs.fd_);
+ 		this->obj_ = rhs.obj_;
+ 		rhs.obj_ = nullptr;
+ 	}
+ 
+ 	~SharedMemObject()
+ 	{
+-		if (obj_) {
++		if (obj_)
+ 			obj_->~T();
+-			munmap(obj_, SIZE);
+-		}
+ 	}
+ 
+ 	/* Make SharedMemObject non-copyable for now. */
+@@ -78,8 +109,7 @@ public:
+ 
+ 	SharedMemObject<T> &operator=(SharedMemObject<T> &&rhs)
+ 	{
+-		this->name_ = std::move(rhs.name_);
+-		this->fd_ = std::move(rhs.fd_);
++		SharedMem::operator=(std::move(rhs));
+ 		this->obj_ = rhs.obj_;
+ 		rhs.obj_ = nullptr;
+ 		return *this;
+@@ -105,19 +135,12 @@ public:
+ 		return *obj_;
+ 	}
+ 
+-	const SharedFD &fd() const
+-	{
+-		return fd_;
+-	}
+-
+ 	explicit operator bool() const
+ 	{
+ 		return !!obj_;
+ 	}
+ 
+ private:
+-	std::string name_;
+-	SharedFD fd_;
+ 	T *obj_;
+ };
+ 
+diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
+index 3c5e43df..94a95ae3 100644
+--- a/src/libcamera/meson.build
++++ b/src/libcamera/meson.build
+@@ -41,6 +41,7 @@ libcamera_sources = files([
+     'process.cpp',
+     'pub_key.cpp',
+     'request.cpp',
++    'shared_mem_object.cpp',
+     'source_paths.cpp',
+     'stream.cpp',
+     'sysfs.cpp',
+diff --git a/src/libcamera/shared_mem_object.cpp b/src/libcamera/shared_mem_object.cpp
+new file mode 100644
+index 00000000..44fe74c2
+--- /dev/null
++++ b/src/libcamera/shared_mem_object.cpp
+@@ -0,0 +1,190 @@
++/* SPDX-License-Identifier: LGPL-2.1-or-later */
++/*
++ * Copyright (C) 2023, Raspberry Pi Ltd
++ *
++ * shared_mem_object.cpp - Helper class for shared memory allocations
++ */
++
++#include "libcamera/internal/shared_mem_object.h"
++
++#include <sys/types.h>
++#include <unistd.h>
++
++/**
++ * \file shared_mem_object.cpp
++ * \brief Helper class for shared memory allocations
++ */
++
++namespace libcamera {
++
++/**
++ * \class SharedMem
++ * \brief Helper class for allocating shared memory
++ *
++ * Memory is allocated and exposed as a SharedFD for use across IPC boundaries.
++ *
++ * SharedMem allocates the shared memory of the given size and maps it.
++ * To check that the shared memory was allocated and mapped successfully, one
++ * needs to verify that the pointer to the shared memory returned by SharedMem::mem()
++ * is not nullptr.
++ *
++ * To access the shared memory from another process the SharedFD should be passed
++ * to that process, and then the shared memory should be mapped into that process
++ * address space by calling mmap().
++ *
++ * A single memfd is created for every SharedMem. If there is a need to allocate
++ * a large number of objects in shared memory, these objects should be grouped
++ * together and use the shared memory allocated by a single SharedMem object if
++ * possible. This will help to minimize the number of created memfd's.
++ */
++
++/**
++ * \fn SharedMem::SharedMem(const std::string &name, std::size_t size)
++ * \brief Constructor for the SharedMem
++ * \param[in] name Name of the SharedMem
++ * \param[in] size Size of the shared memory to allocate and map
++ */
++
++/**
++ * \fn SharedMem::SharedMem(SharedMem &&rhs)
++ * \brief Move constructor for SharedMem
++ * \param[in] rhs The object to move
++ */
++
++/**
++ * \fn SharedMem::~SharedMem()
++ * \brief SharedMem destructor
++ *
++ * Unmaps the allocated shared memory. Decrements the shared memory descriptor use
++ * count.
++ */
++
++/**
++ * \fn SharedMem &SharedMem::operator=(SharedMem &&rhs)
++ * \brief Move constructor for SharedMem
++ * \param[in] rhs The object to move
++ */
++
++/**
++ * \fn const SharedFD &SharedMem::fd() const
++ * \brief Gets the file descriptor for the underlying shared memory
++ * \return The file descriptor
++ */
++
++/**
++ * \fn void *SharedMem::mem() const
++ * \brief Gets the pointer to the underlying shared memory
++ * \return The pointer to the shared memory
++ */
++
++SharedMem::SharedMem(const std::string &name, std::size_t size)
++	: name_(name), size_(size), mem_(nullptr)
++{
++	int fd = memfd_create(name_.c_str(), MFD_CLOEXEC);
++	if (fd < 0)
++		return;
++
++	fd_ = SharedFD(std::move(fd));
++	if (!fd_.isValid())
++		return;
++
++	if (ftruncate(fd_.get(), size_) < 0)
++		return;
++
++	mem_ = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED,
++		    fd_.get(), 0);
++	if (mem_ == MAP_FAILED)
++		mem_ = nullptr;
++}
++
++/**
++ * \var SharedMem::mem_
++ * \brief Pointer to the shared memory allocated
++ */
++
++/**
++ * \class SharedMemObject
++ * \brief Helper class for allocating objects in shared memory
++ *
++ * Memory is allocated and exposed as a SharedFD for use across IPC boundaries.
++ *
++ * Given the type of the object to be created in shared memory and the arguments
++ * to pass to this object's constructor, SharedMemObject allocates the shared memory
++ * of the size of the object and constructs the object in this memory. To ensure
++ * that the SharedMemObject was created successfully, one needs to verify that the
++ * overloaded bool() operator returns true. The object created in the shared memory
++ * can be accessed using the SharedMemObject::operator*() indirection operator. Its
++ * members can be accessed with the SharedMemObject::operator->() member of pointer
++ * operator.
++ *
++ * To access the object from another process the SharedFD should be passed to that
++ * process, and the shared memory should be mapped by calling mmap().
++ *
++ * A single memfd is created for every SharedMemObject. If there is a need to allocate
++ * a large number of objects in shared memory, these objects should be grouped into a
++ * single large object to keep the number of created memfd's reasonably small.
++ */
++
++/**
++ * \var SharedMemObject::SIZE
++ * \brief The size of the object that is going to be stored here
++ */
++
++/**
++ * \fn SharedMemObject< T >::SharedMemObject(const std::string &name, Args &&...args)
++ * \brief Constructor for the SharedMemObject
++ * \param[in] name Name of the SharedMemObject
++ * \param[in] args Args to pass to the constructor of the object in shared memory
++ */
++
++/**
++ * \fn SharedMemObject::SharedMemObject(SharedMemObject<T> &&rhs)
++ * \brief Move constructor for SharedMemObject
++ * \param[in] rhs The object to move
++ */
++
++/**
++ * \fn SharedMemObject::~SharedMemObject()
++ * \brief SharedMemObject destructor
++ *
++ * Destroys the object created in the shared memory and then unmaps the shared memory.
++ * Decrements the shared memory descriptor use count.
++ */
++
++/**
++ * \fn SharedMemObject::operator=(SharedMemObject<T> &&rhs)
++ * \brief Operator= for SharedMemObject
++ * \param[in] rhs The SharedMemObject object to take the data from
++ */
++
++/**
++ * \fn SharedMemObject::operator->()
++ * \brief Operator-> for SharedMemObject
++ * \return The pointer to the object
++ */
++
++/**
++ * \fn const T *SharedMemObject::operator->() const
++ * \brief Operator-> for SharedMemObject
++ * \return The pointer to the const object
++ */
++
++/**
++ * \fn SharedMemObject::operator*()
++ * \brief Operator* for SharedMemObject
++ * \return The reference to the object
++ */
++
++/**
++ * \fn const T &SharedMemObject::operator*() const
++ * \brief Operator* for SharedMemObject
++ * \return Const reference to the object
++ */
++
++/**
++ * \fn SharedMemObject::operator bool()
++ * \brief Operator bool() for SharedMemObject
++ * \return True if the object was created OK in the shared memory, false otherwise
++ */
++
++} // namespace libcamera
+-- 
+2.43.2
+