[libcamera-devel] [PATCH v2 2/2] libcamera: base: object: Prevent the same signal being connected more than once

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Jan 19 01:17:17 CET 2022


Objects shouldn't be connected to the same signal more than once. Doing
so indicates a bug in the code, and can be highlighted in debug builds
with an assert that performs a lookup on the signals_ list.

Remove the support in the test framework which uses multiple Signal
connections on the same object.

Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
 src/libcamera/base/object.cpp | 6 ++++++
 test/signal.cpp               | 8 ++------
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/libcamera/base/object.cpp b/src/libcamera/base/object.cpp
index 3f28768e48f8..7311b1d5a3a1 100644
--- a/src/libcamera/base/object.cpp
+++ b/src/libcamera/base/object.cpp
@@ -284,6 +284,12 @@ void Object::notifyThreadMove()
 
 void Object::connect(SignalBase *signal)
 {
+	/*
+	 * Connecting the same signal to an object multiple times is not
+	 * supported.
+	 */
+	ASSERT(signals_.end() == std::find(signals_.begin(), signals_.end(), signal));
+
 	signals_.push_back(signal);
 }
 
diff --git a/test/signal.cpp b/test/signal.cpp
index fcf2def18df4..a1effaab0346 100644
--- a/test/signal.cpp
+++ b/test/signal.cpp
@@ -212,14 +212,12 @@ protected:
 		/* ----------------- Signal -> Object tests ----------------- */
 
 		/*
-		 * Test automatic disconnection on object deletion. Connect the
-		 * slot twice to ensure all instances are disconnected.
+		 * Test automatic disconnection on object deletion.
 		 */
 		signalVoid_.disconnect();
 
 		SlotObject *slotObject = new SlotObject();
 		signalVoid_.connect(slotObject, &SlotObject::slot);
-		signalVoid_.connect(slotObject, &SlotObject::slot);
 		delete slotObject;
 		valueStatic_ = 0;
 		signalVoid_.emit();
@@ -298,14 +296,12 @@ protected:
 		/* --------- Signal -> Object (multiple inheritance) -------- */
 
 		/*
-		 * Test automatic disconnection on object deletion. Connect the
-		 * slot twice to ensure all instances are disconnected.
+		 * Test automatic disconnection on object deletion.
 		 */
 		signalVoid_.disconnect();
 
 		SlotMulti *slotMulti = new SlotMulti();
 		signalVoid_.connect(slotMulti, &SlotMulti::slot);
-		signalVoid_.connect(slotMulti, &SlotMulti::slot);
 		delete slotMulti;
 		valueStatic_ = 0;
 		signalVoid_.emit();
-- 
2.32.0



More information about the libcamera-devel mailing list