[libcamera-devel] [RFC PATCH 4/6] android: camera_stream: Add thread safety annotation

Hirokazu Honda hiroh at chromium.org
Fri Oct 29 06:14:22 CEST 2021


This applies clang thread safety annotation to CameraStream.
Mutex and MutexLocker there are replaced with Mutex2 and
MutexLocer2.

Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
---
 src/android/camera_stream.cpp | 22 ++++++++++++----------
 src/android/camera_stream.h   | 13 +++++++------
 2 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index 9023c13c..c5272445 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -119,12 +119,13 @@ int CameraStream::configure()
 
 	if (type_ == Type::Internal) {
 		allocator_ = std::make_unique<FrameBufferAllocator>(cameraDevice_->camera());
-		mutex_ = std::make_unique<std::mutex>();
+		mutex_ = std::make_unique<Mutex2>();
 
 		int ret = allocator_->allocate(stream());
 		if (ret < 0)
 			return ret;
 
+		MutexLocker2 lock(*mutex_);
 		/* Save a pointer to the reserved frame buffers */
 		for (const auto &frameBuffer : allocator_->buffers(stream()))
 			buffers_.push_back(frameBuffer.get());
@@ -208,7 +209,7 @@ FrameBuffer *CameraStream::getBuffer()
 	if (!allocator_)
 		return nullptr;
 
-	std::lock_guard<std::mutex> locker(*mutex_);
+	MutexLocker2 lock(*mutex_);
 
 	if (buffers_.empty()) {
 		LOG(HAL, Error) << "Buffer underrun";
@@ -226,20 +227,21 @@ void CameraStream::putBuffer(FrameBuffer *buffer)
 	if (!allocator_)
 		return;
 
-	std::lock_guard<std::mutex> locker(*mutex_);
+	MutexLocker2 lock(*mutex_);
 
 	buffers_.push_back(buffer);
 }
 
 CameraStream::PostProcessorWorker::PostProcessorWorker(PostProcessor *postProcessor)
-	: postProcessor_(postProcessor)
+	: postProcessor_(postProcessor),
+	  state_(State::Stopped)
 {
 }
 
 CameraStream::PostProcessorWorker::~PostProcessorWorker()
 {
 	{
-		libcamera::MutexLocker lock(mutex_);
+		libcamera::MutexLocker2 lock(mutex_);
 		state_ = State::Stopped;
 	}
 
@@ -250,7 +252,7 @@ CameraStream::PostProcessorWorker::~PostProcessorWorker()
 void CameraStream::PostProcessorWorker::start()
 {
 	{
-		libcamera::MutexLocker lock(mutex_);
+		libcamera::MutexLocker2 lock(mutex_);
 		ASSERT(state_ != State::Running);
 		state_ = State::Running;
 	}
@@ -261,7 +263,7 @@ void CameraStream::PostProcessorWorker::start()
 void CameraStream::PostProcessorWorker::queueRequest(Camera3RequestDescriptor::StreamBuffer *dest)
 {
 	{
-		MutexLocker lock(mutex_);
+		MutexLocker2 lock(mutex_);
 		ASSERT(state_ == State::Running);
 		requests_.push(dest);
 	}
@@ -271,10 +273,10 @@ void CameraStream::PostProcessorWorker::queueRequest(Camera3RequestDescriptor::S
 
 void CameraStream::PostProcessorWorker::run()
 {
-	MutexLocker locker(mutex_);
+	MutexLocker2 locker(mutex_);
 
 	while (1) {
-		cv_.wait(locker, [&] {
+		cv_.wait(locker.get(), [&]() REQUIRES(mutex_) {
 			return state_ != State::Running || !requests_.empty();
 		});
 
@@ -308,7 +310,7 @@ void CameraStream::PostProcessorWorker::run()
 
 void CameraStream::PostProcessorWorker::flush()
 {
-	libcamera::MutexLocker lock(mutex_);
+	MutexLocker2 lock(mutex_);
 	state_ = State::Flushing;
 	lock.unlock();
 
diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
index 0c402deb..665bdf5c 100644
--- a/src/android/camera_stream.h
+++ b/src/android/camera_stream.h
@@ -9,13 +9,14 @@
 
 #include <condition_variable>
 #include <memory>
-#include <mutex>
 #include <queue>
 #include <vector>
 
 #include <hardware/camera3.h>
 
+#include <libcamera/base/mutex.h>
 #include <libcamera/base/thread.h>
+#include <libcamera/base/thread_annotations.h>
 
 #include <libcamera/camera.h>
 #include <libcamera/framebuffer.h>
@@ -153,11 +154,11 @@ private:
 	private:
 		PostProcessor *postProcessor_;
 
-		libcamera::Mutex mutex_;
+		libcamera::Mutex2 mutex_;
 		std::condition_variable cv_;
 
-		std::queue<Camera3RequestDescriptor::StreamBuffer *> requests_;
-		State state_ = State::Stopped;
+		std::queue<Camera3RequestDescriptor::StreamBuffer *> requests_ GUARDED_BY(mutex_);
+		State state_ GUARDED_BY(mutex_);
 	};
 
 	int waitFence(int fence);
@@ -169,12 +170,12 @@ private:
 	const unsigned int index_;
 
 	std::unique_ptr<libcamera::FrameBufferAllocator> allocator_;
-	std::vector<libcamera::FrameBuffer *> buffers_;
+	std::vector<libcamera::FrameBuffer *> buffers_ GUARDED_BY(mutex_);
 	/*
 	 * The class has to be MoveConstructible as instances are stored in
 	 * an std::vector in CameraDevice.
 	 */
-	std::unique_ptr<std::mutex> mutex_;
+	std::unique_ptr<libcamera::Mutex2> mutex_;
 	std::unique_ptr<PostProcessor> postProcessor_;
 
 	std::unique_ptr<PostProcessorWorker> worker_;
-- 
2.33.1.1089.g2158813163f-goog



More information about the libcamera-devel mailing list