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

Message ID 20220119001717.2503111-3-kieran.bingham@ideasonboard.com
State Superseded
Delegated to: Kieran Bingham
Headers show
Series
  • libcamera: pipeline_handler: Register requests
Related show

Commit Message

Kieran Bingham Jan. 19, 2022, 12:17 a.m. UTC
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@ideasonboard.com>
---
 src/libcamera/base/object.cpp | 6 ++++++
 test/signal.cpp               | 8 ++------
 2 files changed, 8 insertions(+), 6 deletions(-)

Comments

Jacopo Mondi Jan. 19, 2022, 8:47 a.m. UTC | #1
Hi Kieran,

On Wed, Jan 19, 2022 at 12:17:17AM +0000, Kieran Bingham wrote:
> 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@ideasonboard.com>

This seems better than an arbitrary limit
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>

Thanks
   j

> ---
>  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
>

Patch
diff mbox series

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();