libcamera: thread: Support timeout in wait() function

Add a parameter to the Thread::wait() function to wait with a timeout.
The delay value utils::duration::max() waits forever.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart
2020-01-23 04:48:56 +02:00
parent 0f292e7821
commit 3f207e0b33
2 changed files with 28 additions and 4 deletions
+3 -1
View File
@@ -14,6 +14,8 @@
#include <libcamera/signal.h>
#include "utils.h"
namespace libcamera {
class EventDispatcher;
@@ -33,7 +35,7 @@ public:
void start();
void exit(int code = 0);
void wait();
bool wait(utils::duration duration = utils::duration::max());
bool isRunning();
+25 -3
View File
@@ -8,6 +8,7 @@
#include "thread.h"
#include <atomic>
#include <condition_variable>
#include <list>
#include <unistd.h>
#include <sys/syscall.h>
@@ -155,6 +156,7 @@ private:
std::atomic<EventDispatcher *> dispatcher_;
std::condition_variable cv_;
std::atomic<bool> exit_;
int exitCode_;
@@ -334,6 +336,7 @@ void Thread::finishThread()
data_->mutex_.unlock();
finished.emit(this);
data_->cv_.notify_all();
}
/**
@@ -360,14 +363,33 @@ void Thread::exit(int code)
/**
* \brief Wait for the thread to finish
* \param[in] duration Maximum wait duration
*
* This method waits until the thread finishes, or returns immediately if the
* thread is not running.
* This function waits until the thread finishes or the \a duration has
* elapsed, whichever happens first. If \a duration is equal to
* utils::duration::max(), the wait never times out. If the thread is not
* running the function returns immediately.
*
* \return True if the thread has finished, or false if the wait timed out
*/
void Thread::wait()
bool Thread::wait(utils::duration duration)
{
bool finished = true;
{
MutexLocker locker(data_->mutex_);
if (duration == utils::duration::max())
data_->cv_.wait(locker, [&]() { return !data_->running_; });
else
finished = data_->cv_.wait_for(locker, duration,
[&]() { return !data_->running_; });
}
if (thread_.joinable())
thread_.join();
return finished;
}
/**