[libcamera-devel] [PATCH] hal: Simplify thread RPC with Object::invokeMethod()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Aug 12 17:02:32 CEST 2019


Replace the manual implementation of asynchronous method invocation
through a custom message with Object::invokeMethod(). This simplifies
the thread RPC implementation.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---

This patch applies on top of the "[PATCH 00/18] Object & Thread
enhancements" series.

 src/android/camera_device.cpp |  8 +-------
 src/android/camera_device.h   |  4 +++-
 src/android/camera_proxy.cpp  |  8 +++-----
 src/android/thread_rpc.cpp    | 18 +-----------------
 src/android/thread_rpc.h      | 15 ---------------
 5 files changed, 8 insertions(+), 45 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index e2c1f2a246c8..999c51e6ba4a 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -70,14 +70,8 @@ CameraDevice::~CameraDevice()
 /*
  * Handle RPC request received from the associated proxy.
  */
-void CameraDevice::message(Message *message)
+void CameraDevice::call(ThreadRpc *rpc)
 {
-	if (message->type() != ThreadRpcMessage::type())
-		return Object::message(message);
-
-	ThreadRpcMessage *rpcMessage = static_cast<ThreadRpcMessage *>(message);
-	ThreadRpc *rpc = rpcMessage->rpc;
-
 	switch (rpc->tag) {
 	case ThreadRpc::ProcessCaptureRequest:
 		processCaptureRequest(rpc->request);
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index ac5b95c95104..4d834ceb08a5 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -26,13 +26,15 @@
 		return nullptr;		\
 	} while(0);
 
+class ThreadRpc;
+
 class CameraDevice : public libcamera::Object
 {
 public:
 	CameraDevice(unsigned int id, std::shared_ptr<libcamera::Camera> &camera);
 	~CameraDevice();
 
-	void message(libcamera::Message *message);
+	void call(ThreadRpc *rpc);
 
 	int open();
 	void close();
diff --git a/src/android/camera_proxy.cpp b/src/android/camera_proxy.cpp
index f0cacac8025b..3eb2f9fbcffb 100644
--- a/src/android/camera_proxy.cpp
+++ b/src/android/camera_proxy.cpp
@@ -9,6 +9,8 @@
 
 #include <system/camera_metadata.h>
 
+#include <libcamera/object.h>
+
 #include "log.h"
 #include "message.h"
 #include "utils.h"
@@ -185,10 +187,6 @@ int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)
 
 void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)
 {
-	std::unique_ptr<ThreadRpcMessage> message =
-				utils::make_unique<ThreadRpcMessage>();
-	message->rpc = &rpcRequest;
-
-	cameraDevice_->postMessage(std::move(message));
+	cameraDevice_->invokeMethod(&CameraDevice::call, &rpcRequest);
 	rpcRequest.waitDelivery();
 }
diff --git a/src/android/thread_rpc.cpp b/src/android/thread_rpc.cpp
index 295a05d7c676..f57891ff56bf 100644
--- a/src/android/thread_rpc.cpp
+++ b/src/android/thread_rpc.cpp
@@ -5,19 +5,11 @@
  * thread_rpc.cpp - Inter-thread procedure call
  */
 
+#include "thread.h"
 #include "thread_rpc.h"
 
-#include "message.h"
-
 using namespace libcamera;
 
-libcamera::Message::Type ThreadRpcMessage::rpcType_ = Message::Type::None;
-
-ThreadRpcMessage::ThreadRpcMessage()
-	: Message(type())
-{
-}
-
 void ThreadRpc::notifyReception()
 {
 	{
@@ -32,11 +24,3 @@ void ThreadRpc::waitDelivery()
 	libcamera::MutexLocker locker(mutex_);
 	cv_.wait(locker, [&] { return delivered_; });
 }
-
-Message::Type ThreadRpcMessage::type()
-{
-	if (ThreadRpcMessage::rpcType_ == Message::Type::None)
-		rpcType_ = Message::registerMessageType();
-
-	return rpcType_;
-}
diff --git a/src/android/thread_rpc.h b/src/android/thread_rpc.h
index 6d8992839d0b..f577a5d9fb32 100644
--- a/src/android/thread_rpc.h
+++ b/src/android/thread_rpc.h
@@ -12,9 +12,6 @@
 
 #include <hardware/camera3.h>
 
-#include "message.h"
-#include "thread.h"
-
 class ThreadRpc
 {
 public:
@@ -39,16 +36,4 @@ private:
 	std::condition_variable cv_;
 };
 
-class ThreadRpcMessage : public libcamera::Message
-{
-public:
-	ThreadRpcMessage();
-	ThreadRpc *rpc;
-
-	static Message::Type type();
-
-private:
-	static libcamera::Message::Type rpcType_;
-};
-
 #endif /* __ANDROID_THREAD_RPC_H__ */
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list