[PATCH 08/12] test: signal-threads: Destroy Object from correct thread context

Milan Zamazal mzamazal at redhat.com
Mon Jan 22 21:05:39 CET 2024


Laurent Pinchart <laurent.pinchart at ideasonboard.com> writes:

> The SignalReceiver used in the test is destroyed from the main thread,
> which is invalid for a thread-bound object bound to a different thread.
> Fix it by destroying it with deleteLater().
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Milan Zamazal <mzamazal at redhat.com>

> ---
>  test/signal-threads.cpp | 23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/test/signal-threads.cpp b/test/signal-threads.cpp
> index 8c550eb014d8..8c212b6f9ade 100644
> --- a/test/signal-threads.cpp
> +++ b/test/signal-threads.cpp
> @@ -59,15 +59,20 @@ private:
>  class SignalThreadsTest : public Test
>  {
>  protected:
> +	int init()
> +	{
> +		receiver_ = new SignalReceiver();
> +		signal_.connect(receiver_, &SignalReceiver::slot);
> +
> +		return TestPass;
> +	}
> +
>  	int run()
>  	{
> -		SignalReceiver receiver;
> -		signal_.connect(&receiver, &SignalReceiver::slot);
> -
>  		/* Test that a signal is received in the main thread. */
>  		signal_.emit(0);
>  
> -		switch (receiver.status()) {
> +		switch (receiver_->status()) {
>  		case SignalReceiver::NoSignal:
>  			cout << "No signal received for direct connection" << endl;
>  			return TestFail;
> @@ -83,8 +88,8 @@ protected:
>  		 * Move the object to a thread and verify that the signal is
>  		 * correctly delivered, with the correct data.
>  		 */
> -		receiver.reset();
> -		receiver.moveToThread(&thread_);
> +		receiver_->reset();
> +		receiver_->moveToThread(&thread_);
>  
>  		thread_.start();
>  
> @@ -92,7 +97,7 @@ protected:
>  
>  		this_thread::sleep_for(chrono::milliseconds(100));
>  
> -		switch (receiver.status()) {
> +		switch (receiver_->status()) {
>  		case SignalReceiver::NoSignal:
>  			cout << "No signal received for message connection" << endl;
>  			return TestFail;
> @@ -104,7 +109,7 @@ protected:
>  			break;
>  		}
>  
> -		if (receiver.value() != 42) {
> +		if (receiver_->value() != 42) {
>  			cout << "Signal received with incorrect value" << endl;
>  			return TestFail;
>  		}
> @@ -114,11 +119,13 @@ protected:
>  
>  	void cleanup()
>  	{
> +		receiver_->deleteLater();
>  		thread_.exit(0);
>  		thread_.wait();
>  	}
>  
>  private:
> +	SignalReceiver *receiver_;
>  	Thread thread_;
>  
>  	Signal<int> signal_;



More information about the libcamera-devel mailing list