[libcamera-devel] [PATCH 13/30] cam: camera_session: Access event loop through global instance

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Jul 7 04:19:24 CEST 2021


Don't pass the event loop to the CameraSession constructor, as passing
this global object explicitly isn't a design that can scale.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/cam/camera_session.cpp | 11 ++++++-----
 src/cam/camera_session.h   |  6 ++----
 src/cam/main.cpp           |  2 +-
 3 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp
index 439dcdb29ad7..b26c7974056d 100644
--- a/src/cam/camera_session.cpp
+++ b/src/cam/camera_session.cpp
@@ -13,13 +13,14 @@
 #include <libcamera/control_ids.h>
 
 #include "camera_session.h"
+#include "event_loop.h"
 #include "main.h"
 
 using namespace libcamera;
 
 CameraSession::CameraSession(std::shared_ptr<Camera> camera,
-			     CameraConfiguration *config, EventLoop *loop)
-	: camera_(camera), config_(config), writer_(nullptr), last_(0), loop_(loop),
+			     CameraConfiguration *config)
+	: camera_(camera), config_(config), writer_(nullptr), last_(0),
 	  queueCount_(0), captureCount_(0), captureLimit_(0),
 	  printMetadata_(false)
 {
@@ -145,7 +146,7 @@ int CameraSession::capture(FrameBufferAllocator *allocator)
 	else
 		std::cout << "Capture until user interrupts by SIGINT" << std::endl;
 
-	ret = loop_->exec();
+	ret = EventLoop::instance()->exec();
 	if (ret)
 		std::cout << "Failed to run capture loop" << std::endl;
 
@@ -175,7 +176,7 @@ void CameraSession::requestComplete(Request *request)
 	 * Defer processing of the completed request to the event loop, to avoid
 	 * blocking the camera manager thread.
 	 */
-	loop_->callLater([=]() { processRequest(request); });
+	EventLoop::instance()->callLater([=]() { processRequest(request); });
 }
 
 void CameraSession::processRequest(Request *request)
@@ -231,7 +232,7 @@ void CameraSession::processRequest(Request *request)
 
 	captureCount_++;
 	if (captureLimit_ && captureCount_ >= captureLimit_) {
-		loop_->exit(0);
+		EventLoop::instance()->exit(0);
 		return;
 	}
 
diff --git a/src/cam/camera_session.h b/src/cam/camera_session.h
index ef8a11c3bfb4..270ba3e929e7 100644
--- a/src/cam/camera_session.h
+++ b/src/cam/camera_session.h
@@ -18,17 +18,16 @@
 #include <libcamera/stream.h>
 
 #include "buffer_writer.h"
-#include "event_loop.h"
 #include "options.h"
 
 class CameraSession
 {
 public:
 	CameraSession(std::shared_ptr<libcamera::Camera> camera,
-		      libcamera::CameraConfiguration *config,
-		      EventLoop *loop);
+		      libcamera::CameraConfiguration *config);
 
 	int run(const OptionsParser::Options &options);
+
 private:
 	int capture(libcamera::FrameBufferAllocator *allocator);
 
@@ -43,7 +42,6 @@ private:
 	BufferWriter *writer_;
 	uint64_t last_;
 
-	EventLoop *loop_;
 	unsigned int queueCount_;
 	unsigned int captureCount_;
 	unsigned int captureLimit_;
diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index f71b65a20fe2..90435206d386 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -363,7 +363,7 @@ int CamApp::run()
 	}
 
 	if (options_.isSet(OptCapture)) {
-		CameraSession session(camera_, config_.get(), &loop_);
+		CameraSession session(camera_, config_.get());
 		return session.run(options_);
 	}
 
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list