[RFC,v1,25/54] libcamera: request: Store count of pending buffers
diff mbox series

Message ID 20260629163017.863145-26-barnabas.pocze@ideasonboard.com
State New
Headers show
Series
  • libcamera: Split requests and buffers
Related show

Commit Message

Barnabás Pőcze June 29, 2026, 4:29 p.m. UTC
With the split of requests and buffers, a request will have no information
about which specific buffers are pending for itself, so make the previous
set member into a simple integer counter.

Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
---
 include/libcamera/internal/request.h |  5 ++---
 src/libcamera/request.cpp            | 19 +++++--------------
 2 files changed, 7 insertions(+), 17 deletions(-)

Patch
diff mbox series

diff --git a/include/libcamera/internal/request.h b/include/libcamera/internal/request.h
index 8f570e4f79..09768c6fcd 100644
--- a/include/libcamera/internal/request.h
+++ b/include/libcamera/internal/request.h
@@ -8,7 +8,6 @@ 
 #pragma once
 
 #include <stdint.h>
-#include <unordered_set>
 
 #include <libcamera/base/event_notifier.h>
 
@@ -28,7 +27,7 @@  public:
 	~Private();
 
 	Camera *camera() const { return camera_; }
-	bool hasPendingBuffers() const { return !pending_.empty(); }
+	bool hasPendingBuffers() const { return pending_ > 0; }
 
 	ControlList &metadata() { return metadata_; }
 
@@ -47,7 +46,7 @@  private:
 	bool cancelled_;
 	uint32_t sequence_ = 0;
 
-	std::unordered_set<FrameBuffer *> pending_;
+	size_t pending_ = 0;
 	ControlList metadata_;
 };
 
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 8819ba0ce3..9544a8993d 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -108,8 +108,8 @@  bool Request::Private::completeBuffer(FrameBuffer *buffer)
 
 	ASSERT(request->findBuffer(buffer->_d()->stream_) == buffer);
 
-	int ret = pending_.erase(buffer);
-	ASSERT(ret == 1);
+	ASSERT(pending_ > 0);
+	pending_ -= 1;
 
 	buffer->_d()->setRequest(nullptr);
 	buffer->_d()->stream_ = nullptr;
@@ -143,17 +143,8 @@  void Request::Private::complete()
 
 void Request::Private::doCancelRequest()
 {
-	Request *request = _o<Request>();
-
-	for (FrameBuffer *buffer : pending_) {
-		buffer->_d()->cancel();
-		camera_->bufferCompleted.emit(request, buffer);
-		buffer->_d()->setRequest(nullptr);
-		buffer->_d()->stream_ = nullptr;
-	}
-
 	cancelled_ = true;
-	pending_.clear();
+	pending_ = 0;
 }
 
 /**
@@ -184,7 +175,7 @@  void Request::Private::reset()
 {
 	sequence_ = 0;
 	cancelled_ = false;
-	pending_.clear();
+	pending_ = 0;
 }
 #endif /* __DOXYGEN_PUBLIC__ */
 
@@ -426,7 +417,7 @@  std::ostream &operator<<(std::ostream &out, const Request &r)
 
 	/* Example Output: Request(55:P:1/2:6523524) */
 	out << "Request(" << r.sequence() << ":" << statuses[r.status()] << ":"
-	    << r._d()->pending_.size() << "/" << r.buffers().size() << ":"
+	    << r._d()->pending_ << "/" << r.buffers().size() << ":"
 	    << r.cookie() << ")";
 
 	return out;