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

Message ID 20191028104913.14985-10-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Add support for blocking method invocation
Related show

Commit Message

Laurent Pinchart Oct. 28, 2019, 10:49 a.m. UTC
From: Jacopo Mondi <jacopo@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@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@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

Comments

Niklas Söderlund Oct. 29, 2019, 11:31 p.m. UTC | #1
Hi Jacopo,

Thanks for your patch.

On 2019-10-28 12:49:13 +0200, Laurent Pinchart wrote:
> From: Jacopo Mondi <jacopo@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@jmondi.org>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> ---
>  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
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

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__ */