[libcamera-devel] [PATCH v2 9/9] android: Replace ThreadRPC with blocking method call

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Oct 28 11:49:13 CET 2019


From: Jacopo Mondi <jacopo at jmondi.org>

Use the newly introduced InvocationTypeBlocking message type to replace
the blocking message delivery implemented with the ThreadRPC class in the
Android camera HAL.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/android/camera_device.cpp | 34 ++++++------------------------
 src/android/camera_device.h   |  5 +----
 src/android/camera_proxy.cpp  | 21 ++++---------------
 src/android/camera_proxy.h    |  3 ---
 src/android/meson.build       |  1 -
 src/android/thread_rpc.cpp    | 26 -----------------------
 src/android/thread_rpc.h      | 39 -----------------------------------
 7 files changed, 11 insertions(+), 118 deletions(-)
 delete mode 100644 src/android/thread_rpc.cpp
 delete mode 100644 src/android/thread_rpc.h

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index c7c9b3fd1724..897f545864a9 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -11,7 +11,6 @@
 #include "utils.h"
 
 #include "camera_metadata.h"
-#include "thread_rpc.h"
 
 using namespace libcamera;
 
@@ -64,25 +63,6 @@ CameraDevice::~CameraDevice()
 		delete it.second;
 }
 
-/*
- * Handle RPC request received from the associated proxy.
- */
-void CameraDevice::call(ThreadRpc *rpc)
-{
-	switch (rpc->tag) {
-	case ThreadRpc::ProcessCaptureRequest:
-		processCaptureRequest(rpc->request);
-		break;
-	case ThreadRpc::Close:
-		close();
-		break;
-	default:
-		LOG(HAL, Error) << "Unknown RPC operation: " << rpc->tag;
-	}
-
-	rpc->notifyReception();
-}
-
 int CameraDevice::open()
 {
 	int ret = camera_->acquire();
@@ -698,7 +678,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
 	return 0;
 }
 
-int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)
+void CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)
 {
 	StreamConfiguration *streamConfiguration = &config_->at(0);
 	Stream *stream = streamConfiguration->stream();
@@ -706,7 +686,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 	if (camera3Request->num_output_buffers != 1) {
 		LOG(HAL, Error) << "Invalid number of output buffers: "
 				<< camera3Request->num_output_buffers;
-		return -EINVAL;
+		return;
 	}
 
 	/* Start the camera if that's the first request we handle. */
@@ -714,14 +694,14 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 		int ret = camera_->allocateBuffers();
 		if (ret) {
 			LOG(HAL, Error) << "Failed to allocate buffers";
-			return ret;
+			return;
 		}
 
 		ret = camera_->start();
 		if (ret) {
 			LOG(HAL, Error) << "Failed to start camera";
 			camera_->freeBuffers();
-			return ret;
+			return;
 		}
 
 		running_ = true;
@@ -769,7 +749,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 	if (!buffer) {
 		LOG(HAL, Error) << "Failed to create buffer";
 		delete descriptor;
-		return -EINVAL;
+		return;
 	}
 
 	Request *request =
@@ -782,13 +762,11 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 		goto error;
 	}
 
-	return 0;
+	return;
 
 error:
 	delete request;
 	delete descriptor;
-
-	return ret;
 }
 
 void CameraDevice::requestComplete(Request *request,
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index d5d136a74f4a..2105b5b9a1e7 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -20,7 +20,6 @@
 #include "message.h"
 
 class CameraMetadata;
-class ThreadRpc;
 
 class CameraDevice : public libcamera::Object
 {
@@ -28,15 +27,13 @@ public:
 	CameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);
 	~CameraDevice();
 
-	void call(ThreadRpc *rpc);
-
 	int open();
 	void close();
 	void setCallbacks(const camera3_callback_ops_t *callbacks);
 	camera_metadata_t *getStaticMetadata();
 	const camera_metadata_t *constructDefaultRequestSettings(int type);
 	int configureStreams(camera3_stream_configuration_t *stream_list);
-	int processCaptureRequest(camera3_capture_request_t *request);
+	void processCaptureRequest(camera3_capture_request_t *request);
 	void requestComplete(libcamera::Request *request,
 			     const std::map<libcamera::Stream *, libcamera::Buffer *> &buffers);
 
diff --git a/src/android/camera_proxy.cpp b/src/android/camera_proxy.cpp
index 43e1e1c3af53..3964b5665e2f 100644
--- a/src/android/camera_proxy.cpp
+++ b/src/android/camera_proxy.cpp
@@ -16,7 +16,6 @@
 #include "utils.h"
 
 #include "camera_device.h"
-#include "thread_rpc.h"
 
 using namespace libcamera;
 
@@ -148,10 +147,8 @@ int CameraProxy::open(const hw_module_t *hardwareModule)
 
 void CameraProxy::close()
 {
-	ThreadRpc rpcRequest;
-	rpcRequest.tag = ThreadRpc::Close;
-
-	threadRpcCall(rpcRequest);
+	cameraDevice_->invokeMethod(&CameraDevice::close,
+				    ConnectionTypeBlocking);
 }
 
 void CameraProxy::initialize(const camera3_callback_ops_t *callbacks)
@@ -176,18 +173,8 @@ int CameraProxy::configureStreams(camera3_stream_configuration_t *stream_list)
 
 int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)
 {
-	ThreadRpc rpcRequest;
-	rpcRequest.tag = ThreadRpc::ProcessCaptureRequest;
-	rpcRequest.request = request;
-
-	threadRpcCall(rpcRequest);
+	cameraDevice_->invokeMethod(&CameraDevice::processCaptureRequest,
+				    ConnectionTypeBlocking, request);
 
 	return 0;
 }
-
-void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)
-{
-	cameraDevice_->invokeMethod(&CameraDevice::call, ConnectionTypeQueued,
-				    &rpcRequest);
-	rpcRequest.waitDelivery();
-}
diff --git a/src/android/camera_proxy.h b/src/android/camera_proxy.h
index 7940eac4e376..e8cfbc9dd526 100644
--- a/src/android/camera_proxy.h
+++ b/src/android/camera_proxy.h
@@ -14,7 +14,6 @@
 #include <libcamera/camera.h>
 
 class CameraDevice;
-class ThreadRpc;
 
 class CameraProxy
 {
@@ -35,8 +34,6 @@ public:
 	camera3_device_t *camera3Device() { return &camera3Device_; }
 
 private:
-	void threadRpcCall(ThreadRpc &rpcRequest);
-
 	unsigned int id_;
 	CameraDevice *cameraDevice_;
 	camera3_device_t camera3Device_;
diff --git a/src/android/meson.build b/src/android/meson.build
index b5e4eeeb73a8..70dfcc1df27a 100644
--- a/src/android/meson.build
+++ b/src/android/meson.build
@@ -4,7 +4,6 @@ android_hal_sources = files([
     'camera_device.cpp',
     'camera_metadata.cpp',
     'camera_proxy.cpp',
-    'thread_rpc.cpp'
 ])
 
 android_camera_metadata_sources = files([
diff --git a/src/android/thread_rpc.cpp b/src/android/thread_rpc.cpp
deleted file mode 100644
index f57891ff56bf..000000000000
--- a/src/android/thread_rpc.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2019, Google Inc.
- *
- * thread_rpc.cpp - Inter-thread procedure call
- */
-
-#include "thread.h"
-#include "thread_rpc.h"
-
-using namespace libcamera;
-
-void ThreadRpc::notifyReception()
-{
-	{
-		libcamera::MutexLocker locker(mutex_);
-		delivered_ = true;
-	}
-	cv_.notify_one();
-}
-
-void ThreadRpc::waitDelivery()
-{
-	libcamera::MutexLocker locker(mutex_);
-	cv_.wait(locker, [&] { return delivered_; });
-}
diff --git a/src/android/thread_rpc.h b/src/android/thread_rpc.h
deleted file mode 100644
index f577a5d9fb32..000000000000
--- a/src/android/thread_rpc.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2019, Google Inc.
- *
- * thread_rpc.h - Inter-thread procedure call
- */
-#ifndef __ANDROID_THREAD_RPC_H__
-#define __ANDROID_THREAD_RPC_H__
-
-#include <condition_variable>
-#include <mutex>
-
-#include <hardware/camera3.h>
-
-class ThreadRpc
-{
-public:
-	enum RpcTag {
-		ProcessCaptureRequest,
-		Close,
-	};
-
-	ThreadRpc()
-		: delivered_(false) {}
-
-	void notifyReception();
-	void waitDelivery();
-
-	RpcTag tag;
-
-	camera3_capture_request_t *request;
-
-private:
-	bool delivered_;
-	std::mutex mutex_;
-	std::condition_variable cv_;
-};
-
-#endif /* __ANDROID_THREAD_RPC_H__ */
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list