[libcamera-devel] [PATCH v2 1/3] libcamera: thread: Support timeout in wait() function
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Feb 13 13:45:36 CET 2020
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 at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
Changes since v1:
- Invert return value of the wait() function to match the documentation
---
src/libcamera/include/thread.h | 4 +++-
src/libcamera/thread.cpp | 28 +++++++++++++++++++++++++---
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/src/libcamera/include/thread.h b/src/libcamera/include/thread.h
index 819a9879ac56..d700f111a3ae 100644
--- a/src/libcamera/include/thread.h
+++ b/src/libcamera/include/thread.h
@@ -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();
diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp
index 1d0a600ab5cc..b613305fdc87 100644
--- a/src/libcamera/thread.cpp
+++ b/src/libcamera/thread.cpp
@@ -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;
}
/**
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list