[libcamera-devel,7/7] v4l2: v4l2_camera: Apply clang thread safety annotation
diff mbox series

Message ID 20211203164619.1541033-8-hiroh@chromium.org
State Accepted
Headers show
Series
  • Apply clang thread safety annotation libcamera-core and v4l2
Related show

Commit Message

Hirokazu Honda Dec. 3, 2021, 4:46 p.m. UTC
This annotates member functions and variables of V4L2Camera by
clang thread safety annotations.

Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
---
 src/v4l2/v4l2_camera.cpp |  5 ++---
 src/v4l2/v4l2_camera.h   | 14 ++++++++------
 2 files changed, 10 insertions(+), 9 deletions(-)

Patch
diff mbox series

diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp
index 157ab94e..6d571953 100644
--- a/src/v4l2/v4l2_camera.cpp
+++ b/src/v4l2/v4l2_camera.cpp
@@ -71,11 +71,10 @@  std::vector<V4L2Camera::Buffer> V4L2Camera::completedBuffers()
 {
 	std::vector<Buffer> v;
 
-	bufferLock_.lock();
+	MutexLocker lock(bufferLock_);
 	for (std::unique_ptr<Buffer> &metadata : completedBuffers_)
 		v.push_back(*metadata.get());
 	completedBuffers_.clear();
-	bufferLock_.unlock();
 
 	return v;
 }
@@ -278,7 +277,7 @@  int V4L2Camera::qbuf(unsigned int index)
 void V4L2Camera::waitForBufferAvailable()
 {
 	MutexLocker locker(bufferMutex_);
-	bufferCV_.wait(locker, [&] {
+	bufferCV_.wait(locker, [&]() LIBCAMERA_TSA_REQUIRES(bufferMutex_) {
 			       return bufferAvailableCount_ >= 1 || !isRunning_;
 		       });
 	if (isRunning_)
diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h
index 9307d61d..0d5a8948 100644
--- a/src/v4l2/v4l2_camera.h
+++ b/src/v4l2/v4l2_camera.h
@@ -39,7 +39,7 @@  public:
 	void bind(int efd);
 	void unbind();
 
-	std::vector<Buffer> completedBuffers();
+	std::vector<Buffer> completedBuffers() LIBCAMERA_TSA_EXCLUDES(bufferLock_);
 
 	int configure(libcamera::StreamConfiguration *streamConfigOut,
 		      const libcamera::Size &size,
@@ -58,13 +58,14 @@  public:
 
 	int qbuf(unsigned int index);
 
-	void waitForBufferAvailable();
-	bool isBufferAvailable();
+	void waitForBufferAvailable() LIBCAMERA_TSA_EXCLUDES(bufferMutex_);
+	bool isBufferAvailable() LIBCAMERA_TSA_EXCLUDES(bufferMutex_);
 
 	bool isRunning();
 
 private:
-	void requestComplete(libcamera::Request *request);
+	void requestComplete(libcamera::Request *request)
+		LIBCAMERA_TSA_EXCLUDES(bufferLock_);
 
 	std::shared_ptr<libcamera::Camera> camera_;
 	std::unique_ptr<libcamera::CameraConfiguration> config_;
@@ -77,11 +78,12 @@  private:
 	std::vector<std::unique_ptr<libcamera::Request>> requestPool_;
 
 	std::deque<libcamera::Request *> pendingRequests_;
-	std::deque<std::unique_ptr<Buffer>> completedBuffers_;
+	std::deque<std::unique_ptr<Buffer>> completedBuffers_
+		LIBCAMERA_TSA_GUARDED_BY(bufferLock_);
 
 	int efd_;
 
 	libcamera::Mutex bufferMutex_;
 	libcamera::ConditionVariable bufferCV_;
-	unsigned int bufferAvailableCount_;
+	unsigned int bufferAvailableCount_ LIBCAMERA_TSA_GUARDED_BY(bufferMutex_);
 };