summaryrefslogtreecommitdiff
path: root/src/libcamera/base/object.cpp
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2022-01-19 00:17:17 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2022-02-04 10:13:29 +0000
commit7653021549583a58660d46e3d160c82f58f22c69 (patch)
treec0f131cbe7c0387af727b6b58ff8587ac9bbdc93 /src/libcamera/base/object.cpp
parent20272b9b188fb1f9c8f4125806c8a2c7f141b389 (diff)
libcamera: base: object: Prevent the same signal being connected more than once
Objects are not expected to be connected to the same signal more than once. Doing so likely indicates a bug in the code, and can be highlighted in debug builds with an assert that performs a lookup on the signals_ list. While it is possible to allow the implementation to let objects connect to a specific signal multiple times, there are no expected use cases for this in libcamera and this behaviour is restricted to favour defensive programming by raising an error when this occurs. Remove the support in the test framework which uses multiple Signal connections on the same object, and update the test to use a second Signal. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/base/object.cpp')
-rw-r--r--src/libcamera/base/object.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libcamera/base/object.cpp b/src/libcamera/base/object.cpp
index 3f28768e..ec5b55d1 100644
--- a/src/libcamera/base/object.cpp
+++ b/src/libcamera/base/object.cpp
@@ -47,6 +47,14 @@ LOG_DEFINE_CATEGORY(Object)
* object's thread, regardless of whether the signal is emitted in the same or
* in another thread.
*
+ * Objects can be connected to multiple signals, but they can only be connected
+ * to each signal once. Attempting to create multiple concurrent connections
+ * between the same signal and the same Object (to either the same or differents
+ * slots of the object) will cause an assertion failure. While it would be
+ * possible to allow the implementation to let objects connect to the same
+ * signal multiple times, there are no expected use cases for this in libcamera
+ * and this behaviour is restricted to favour defensive programming.
+ *
* \sa Message, Signal, Thread
*/
@@ -284,6 +292,12 @@ void Object::notifyThreadMove()
void Object::connect(SignalBase *signal)
{
+ /*
+ * Connecting the same signal to an object multiple times is not
+ * supported.
+ */
+ ASSERT(std::find(signals_.begin(), signals_.end(), signal) == signals_.end());
+
signals_.push_back(signal);
}