[libcamera-devel] [PATCH] test: threads: Fix memory leak

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Apr 12 09:24:02 CEST 2021


Hi Sebastian,

On Mon, Apr 12, 2021 at 06:21:36AM +0200, Sebastian Fricke wrote:
> Hey Laurent,
> 
> Thank you for the patch.
> 
> On 12.04.2021 00:36, Laurent Pinchart wrote:
> > The last instance of Thread allocated in the test is never deleted, not
> 
> s/not/nor/ ?

Oops, indeed.

> > are other instances deleted in error paths. Use a std::unique_ptr<> to
> > ensure deletion.
> 
> I tested this fix and valgrind does not report any leaked memory from
> the libcamera tests. But just out of curiosity do you get a similar
> report in valgrind:
> ```
> basti at nanopct4:~/libcamera$ valgrind --leak-check=full --show-leak-kinds=all ninja -C build test
> ...
> libcamera 0.0.0
> 
>    Configuration
>      Enabled pipelines     : ipu3
>                              raspberrypi
>                              rkisp1
>                              simple
>                              uvcvideo
>                              vimc
>      Android support       : False
>      GStreamer support     : False
>      V4L2 emulation support: False
>      cam application       : True
>      qcam application      : False
>      Unit tests            : True
> 
> Option werror is: true [default: true]
> ...
> ==6151== LEAK SUMMARY:
> ==6151==    definitely lost: 296 bytes in 1 blocks
> ==6151==    indirectly lost: 576 bytes in 2 blocks
> ==6151==      possibly lost: 0 bytes in 0 blocks
> ==6151==    still reachable: 2,725,231 bytes in 15,220 blocks
> ==6151==         suppressed: 0 bytes in 0 blocks
> ```
> 
> Those are all related to our build tool ninja.

That's checking for leaks in ninja itself, it's not ours.

> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> Tested-by: Sebastian Fricke <sebastian.fricke at posteo.net>
> 
> > ---
> >  test/threads.cpp | 19 ++++++++-----------
> >  1 file changed, 8 insertions(+), 11 deletions(-)
> > 
> > diff --git a/test/threads.cpp b/test/threads.cpp
> > index b4b8d913cd2b..e0c50dc90a65 100644
> > --- a/test/threads.cpp
> > +++ b/test/threads.cpp
> > @@ -7,6 +7,7 @@
> > 
> >  #include <chrono>
> >  #include <iostream>
> > +#include <memory>
> >  #include <thread>
> > 
> >  #include "libcamera/internal/thread.h"
> > @@ -45,23 +46,23 @@ protected:
> >  	int run()
> >  	{
> >  		/* Test Thread() retrieval for the main thread. */
> > -		Thread *thread = Thread::current();
> > -		if (!thread) {
> > +		Thread *mainThread = Thread::current();
> > +		if (!mainThread) {
> >  			cout << "Thread::current() failed to main thread"
> >  			     << endl;
> >  			return TestFail;
> >  		}
> > 
> > -		if (!thread->isRunning()) {
> > +		if (!mainThread->isRunning()) {
> >  			cout << "Main thread is not running" << endl;
> >  			return TestFail;
> >  		}
> > 
> >  		/* Test starting the main thread, the test shall not crash. */
> > -		thread->start();
> > +		mainThread->start();
> > 
> >  		/* Test the running state of a custom thread. */
> > -		thread = new Thread();
> > +		std::unique_ptr<Thread> thread = std::make_unique<Thread>();
> >  		thread->start();
> > 
> >  		if (!thread->isRunning()) {
> > @@ -79,10 +80,8 @@ protected:
> >  			return TestFail;
> >  		}
> > 
> > -		delete thread;
> > -
> >  		/* Test waiting for completion with a timeout. */
> > -		thread = new DelayThread(chrono::milliseconds(500));
> > +		thread = std::make_unique<DelayThread>(chrono::milliseconds(500));
> >  		thread->start();
> >  		thread->exit(0);
> > 
> > @@ -100,10 +99,8 @@ protected:
> >  			return TestFail;
> >  		}
> > 
> > -		delete thread;
> > -
> >  		/* Test waiting on a thread that isn't running. */
> > -		thread = new Thread();
> > +		thread = std::make_unique<Thread>();
> > 
> >  		timeout = !thread->wait();
> >  		if (timeout) {

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list