[libcamera-devel] [PATCH 3/4] libcamera: camera_manager: Inherit from Extensible
Niklas Söderlund
niklas.soderlund at ragnatech.se
Mon Sep 21 11:24:39 CEST 2020
Hi Laurent,
Thanks for your work.
On 2020-09-21 06:10:56 +0300, Laurent Pinchart wrote:
> Use the d-pointer infrastructure offered by the Extensible class to
> replace the custom implementation.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> include/libcamera/camera_manager.h | 7 ++--
> src/libcamera/camera_manager.cpp | 55 +++++++++++++++++++-----------
> 2 files changed, 38 insertions(+), 24 deletions(-)
>
> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
> index 9eb2b6f5a5f5..6d5341c76412 100644
> --- a/include/libcamera/camera_manager.h
> +++ b/include/libcamera/camera_manager.h
> @@ -12,6 +12,7 @@
> #include <sys/types.h>
> #include <vector>
>
> +#include <libcamera/extensible.h>
> #include <libcamera/object.h>
> #include <libcamera/signal.h>
>
> @@ -20,8 +21,9 @@ namespace libcamera {
> class Camera;
> class EventDispatcher;
>
> -class CameraManager : public Object
> +class CameraManager : public Object, public Extensible
> {
> + LIBCAMERA_DECLARE_PRIVATE(CameraManager)
> public:
> CameraManager();
> CameraManager(const CameraManager &) = delete;
> @@ -50,9 +52,6 @@ public:
> private:
> static const std::string version_;
> static CameraManager *self_;
> -
> - class Private;
> - std::unique_ptr<Private> p_;
> };
>
> } /* namespace libcamera */
> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> index 780a66a7ac10..77b49709cd96 100644
> --- a/src/libcamera/camera_manager.cpp
> +++ b/src/libcamera/camera_manager.cpp
> @@ -30,8 +30,10 @@ namespace libcamera {
>
> LOG_DEFINE_CATEGORY(Camera)
>
> -class CameraManager::Private : public Thread
> +class CameraManager::Private : public Extensible::Private, public Thread
> {
> + LIBCAMERA_DECLARE_PUBLIC(CameraManager)
> +
> public:
> Private(CameraManager *cm);
>
> @@ -58,8 +60,6 @@ private:
> void createPipelineHandlers();
> void cleanup();
>
> - CameraManager *cm_;
> -
> std::condition_variable cv_;
> bool initialized_;
> int status_;
> @@ -70,7 +70,7 @@ private:
> };
>
> CameraManager::Private::Private(CameraManager *cm)
> - : cm_(cm), initialized_(false)
> + : Extensible::Private(cm), initialized_(false)
> {
> }
>
> @@ -131,6 +131,8 @@ int CameraManager::Private::init()
>
> void CameraManager::Private::createPipelineHandlers()
> {
> + LIBCAMERA_O_PTR(CameraManager);
> +
> /*
> * \todo Try to read handlers and order from configuration
> * file and only fallback on all handlers if there is no
> @@ -145,7 +147,7 @@ void CameraManager::Private::createPipelineHandlers()
> * all pipelines it can provide.
> */
> while (1) {
> - std::shared_ptr<PipelineHandler> pipe = factory->create(cm_);
> + std::shared_ptr<PipelineHandler> pipe = factory->create(o);
> if (!pipe->match(enumerator_.get()))
> break;
>
> @@ -256,7 +258,7 @@ void CameraManager::Private::removeCamera(Camera *camera)
> CameraManager *CameraManager::self_ = nullptr;
>
> CameraManager::CameraManager()
> - : p_(new CameraManager::Private(this))
> + : Extensible(new CameraManager::Private(this))
> {
> if (self_)
> LOG(Camera, Fatal)
> @@ -284,9 +286,11 @@ CameraManager::~CameraManager()
> */
> int CameraManager::start()
> {
> + LIBCAMERA_D_PTR(CameraManager);
> +
> LOG(Camera, Info) << "libcamera " << version_;
>
> - int ret = p_->start();
> + int ret = d->start();
> if (ret)
> LOG(Camera, Error) << "Failed to start camera manager: "
> << strerror(-ret);
> @@ -306,8 +310,9 @@ int CameraManager::start()
> */
> void CameraManager::stop()
> {
> - p_->exit();
> - p_->wait();
> + LIBCAMERA_D_PTR(CameraManager);
> + d->exit();
> + d->wait();
> }
>
> /**
> @@ -323,9 +328,11 @@ void CameraManager::stop()
> */
> std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
> {
> - MutexLocker locker(p_->mutex_);
> + LIBCAMERA_D_PTR(CameraManager);
>
> - return p_->cameras_;
> + MutexLocker locker(d->mutex_);
> +
> + return d->cameras_;
> }
>
> /**
> @@ -341,9 +348,11 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
> */
> std::shared_ptr<Camera> CameraManager::get(const std::string &id)
> {
> - MutexLocker locker(p_->mutex_);
> + LIBCAMERA_D_PTR(CameraManager);
>
> - for (std::shared_ptr<Camera> camera : p_->cameras_) {
> + MutexLocker locker(d->mutex_);
> +
> + for (std::shared_ptr<Camera> camera : d->cameras_) {
> if (camera->id() == id)
> return camera;
> }
> @@ -369,10 +378,12 @@ std::shared_ptr<Camera> CameraManager::get(const std::string &id)
> */
> std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
> {
> - MutexLocker locker(p_->mutex_);
> + LIBCAMERA_D_PTR(CameraManager);
>
> - auto iter = p_->camerasByDevnum_.find(devnum);
> - if (iter == p_->camerasByDevnum_.end())
> + MutexLocker locker(d->mutex_);
> +
> + auto iter = d->camerasByDevnum_.find(devnum);
> + if (iter == d->camerasByDevnum_.end())
> return nullptr;
>
> return iter->second.lock();
> @@ -423,9 +434,11 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
> void CameraManager::addCamera(std::shared_ptr<Camera> camera,
> const std::vector<dev_t> &devnums)
> {
> - ASSERT(Thread::current() == p_.get());
> + LIBCAMERA_D_PTR(CameraManager);
>
> - p_->addCamera(camera, devnums);
> + ASSERT(Thread::current() == d);
> +
> + d->addCamera(camera, devnums);
> cameraAdded.emit(camera);
> }
>
> @@ -441,9 +454,11 @@ void CameraManager::addCamera(std::shared_ptr<Camera> camera,
> */
> void CameraManager::removeCamera(std::shared_ptr<Camera> camera)
> {
> - ASSERT(Thread::current() == p_.get());
> + LIBCAMERA_D_PTR(CameraManager);
>
> - p_->removeCamera(camera.get());
> + ASSERT(Thread::current() == d);
> +
> + d->removeCamera(camera.get());
> cameraRemoved.emit(camera);
> }
>
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list