[libcamera-devel] [PATCH v2 2/5] libcamera: base: thread: Apply clang thread safety annotation
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Aug 28 20:30:08 CEST 2022
Hi Umang and Hiro,
Thank you for the patch.
On Mon, Jun 20, 2022 at 10:20:24PM +0530, Umang Jain via libcamera-devel wrote:
> From: Hirokazu Honda <hiroh at chromium.org>
>
> This annotates member variables of ThreadData by clang thread
> safety annotations.
>
> Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
> src/libcamera/base/thread.cpp | 22 +++++++++++++++-------
> 1 file changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp
> index 6bda9d14..2e26b83c 100644
> --- a/src/libcamera/base/thread.cpp
> +++ b/src/libcamera/base/thread.cpp
> @@ -151,7 +151,7 @@ private:
> friend class ThreadMain;
>
> Thread *thread_;
> - bool running_;
> + bool running_ LIBCAMERA_TSA_GUARDED_BY(mutex_);
> pid_t tid_;
>
> Mutex mutex_;
> @@ -160,7 +160,7 @@ private:
>
> ConditionVariable cv_;
> std::atomic<bool> exit_;
> - int exitCode_;
> + int exitCode_ LIBCAMERA_TSA_GUARDED_BY(mutex_);
>
> MessageQueue messages_;
> };
> @@ -422,11 +422,19 @@ bool Thread::wait(utils::duration duration)
> {
> MutexLocker locker(data_->mutex_);
>
> - if (duration == utils::duration::max())
> - data_->cv_.wait(locker, [&]() { return !data_->running_; });
> - else
> - hasFinished = data_->cv_.wait_for(locker, duration,
> - [&]() { return !data_->running_; });
> + if (duration == utils::duration::max()) {
> + data_->cv_.wait(
> + locker,
> + [&]() LIBCAMERA_TSA_REQUIRES(data_->mutex_) {
> + return !data_->running_;
> + });
> + } else {
> + hasFinished = data_->cv_.wait_for(
> + locker, duration,
> + [&]() LIBCAMERA_TSA_REQUIRES(data_->mutex_) {
> + return !data_->running_;
> + });
> + }
Let's improve readability a bit:
auto isRunning = [&]() LIBCAMERA_TSA_REQUIRES(data_->mutex_) {
return !data_->running_;
});
if (duration == utils::duration::max())
data_->cv_.wait(locker, isRunning);
else
hasFinished = data_->cv_.wait_for(locker, duration,
isRunning);
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> }
>
> if (thread_.joinable())
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list