{"id":2282,"url":"https://patchwork.libcamera.org/api/patches/2282/?format=json","web_url":"https://patchwork.libcamera.org/patch/2282/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20191028104913.14985-10-laurent.pinchart@ideasonboard.com>","date":"2019-10-28T10:49:13","name":"[libcamera-devel,v2,9/9] android: Replace ThreadRPC with blocking method call","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"16a682609bfb20b27900bcdd80244262ee5eb574","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/?format=json","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/2282/mbox/","series":[{"id":562,"url":"https://patchwork.libcamera.org/api/series/562/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=562","date":"2019-10-28T10:49:04","name":"Add support for blocking method invocation","version":2,"mbox":"https://patchwork.libcamera.org/series/562/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/2282/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/2282/checks/","tags":{},"headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5FFB761514\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Oct 2019 11:49:27 +0100 (CET)","from pendragon.ideasonboard.com (unknown [91.217.168.176])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1A9E19C2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Oct 2019 11:49:27 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1572259767;\n\tbh=KJQRk/mfhn82QYmQ1g9EnP7fgiM5aHgDErpvFKsmWPE=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=jEIJ4wSYMmb28pRZ1SgYebMl02Wx/goqPVYqaKr7awbBAVshmHM7HU1qHG0c6KwtT\n\t9SBxnZvN00Zsw3az9Xa69lUZHUD0dN+EWeZCucZkV47W9d2jySEBckFcsRTTlXLGpl\n\teE+YiHhYeALtyx9tTXh8lgV8xGIk+JTxBleHGMug=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Mon, 28 Oct 2019 12:49:13 +0200","Message-Id":"<20191028104913.14985-10-laurent.pinchart@ideasonboard.com>","X-Mailer":"git-send-email 2.23.0","In-Reply-To":"<20191028104913.14985-1-laurent.pinchart@ideasonboard.com>","References":"<20191028104913.14985-1-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH v2 9/9] android: Replace ThreadRPC with\n\tblocking method call","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Mon, 28 Oct 2019 10:49:28 -0000"},"content":"From: Jacopo Mondi <jacopo@jmondi.org>\n\nUse the newly introduced InvocationTypeBlocking message type to replace\nthe blocking message delivery implemented with the ThreadRPC class in the\nAndroid camera HAL.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/android/camera_device.cpp | 34 ++++++------------------------\n src/android/camera_device.h   |  5 +----\n src/android/camera_proxy.cpp  | 21 ++++---------------\n src/android/camera_proxy.h    |  3 ---\n src/android/meson.build       |  1 -\n src/android/thread_rpc.cpp    | 26 -----------------------\n src/android/thread_rpc.h      | 39 -----------------------------------\n 7 files changed, 11 insertions(+), 118 deletions(-)\n delete mode 100644 src/android/thread_rpc.cpp\n delete mode 100644 src/android/thread_rpc.h","diff":"diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex c7c9b3fd1724..897f545864a9 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -11,7 +11,6 @@\n #include \"utils.h\"\n \n #include \"camera_metadata.h\"\n-#include \"thread_rpc.h\"\n \n using namespace libcamera;\n \n@@ -64,25 +63,6 @@ CameraDevice::~CameraDevice()\n \t\tdelete it.second;\n }\n \n-/*\n- * Handle RPC request received from the associated proxy.\n- */\n-void CameraDevice::call(ThreadRpc *rpc)\n-{\n-\tswitch (rpc->tag) {\n-\tcase ThreadRpc::ProcessCaptureRequest:\n-\t\tprocessCaptureRequest(rpc->request);\n-\t\tbreak;\n-\tcase ThreadRpc::Close:\n-\t\tclose();\n-\t\tbreak;\n-\tdefault:\n-\t\tLOG(HAL, Error) << \"Unknown RPC operation: \" << rpc->tag;\n-\t}\n-\n-\trpc->notifyReception();\n-}\n-\n int CameraDevice::open()\n {\n \tint ret = camera_->acquire();\n@@ -698,7 +678,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n \treturn 0;\n }\n \n-int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)\n+void CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)\n {\n \tStreamConfiguration *streamConfiguration = &config_->at(0);\n \tStream *stream = streamConfiguration->stream();\n@@ -706,7 +686,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \tif (camera3Request->num_output_buffers != 1) {\n \t\tLOG(HAL, Error) << \"Invalid number of output buffers: \"\n \t\t\t\t<< camera3Request->num_output_buffers;\n-\t\treturn -EINVAL;\n+\t\treturn;\n \t}\n \n \t/* Start the camera if that's the first request we handle. */\n@@ -714,14 +694,14 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \t\tint ret = camera_->allocateBuffers();\n \t\tif (ret) {\n \t\t\tLOG(HAL, Error) << \"Failed to allocate buffers\";\n-\t\t\treturn ret;\n+\t\t\treturn;\n \t\t}\n \n \t\tret = camera_->start();\n \t\tif (ret) {\n \t\t\tLOG(HAL, Error) << \"Failed to start camera\";\n \t\t\tcamera_->freeBuffers();\n-\t\t\treturn ret;\n+\t\t\treturn;\n \t\t}\n \n \t\trunning_ = true;\n@@ -769,7 +749,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \tif (!buffer) {\n \t\tLOG(HAL, Error) << \"Failed to create buffer\";\n \t\tdelete descriptor;\n-\t\treturn -EINVAL;\n+\t\treturn;\n \t}\n \n \tRequest *request =\n@@ -782,13 +762,11 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \t\tgoto error;\n \t}\n \n-\treturn 0;\n+\treturn;\n \n error:\n \tdelete request;\n \tdelete descriptor;\n-\n-\treturn ret;\n }\n \n void CameraDevice::requestComplete(Request *request,\ndiff --git a/src/android/camera_device.h b/src/android/camera_device.h\nindex d5d136a74f4a..2105b5b9a1e7 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -20,7 +20,6 @@\n #include \"message.h\"\n \n class CameraMetadata;\n-class ThreadRpc;\n \n class CameraDevice : public libcamera::Object\n {\n@@ -28,15 +27,13 @@ public:\n \tCameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);\n \t~CameraDevice();\n \n-\tvoid call(ThreadRpc *rpc);\n-\n \tint open();\n \tvoid close();\n \tvoid setCallbacks(const camera3_callback_ops_t *callbacks);\n \tcamera_metadata_t *getStaticMetadata();\n \tconst camera_metadata_t *constructDefaultRequestSettings(int type);\n \tint configureStreams(camera3_stream_configuration_t *stream_list);\n-\tint processCaptureRequest(camera3_capture_request_t *request);\n+\tvoid processCaptureRequest(camera3_capture_request_t *request);\n \tvoid requestComplete(libcamera::Request *request,\n \t\t\t     const std::map<libcamera::Stream *, libcamera::Buffer *> &buffers);\n \ndiff --git a/src/android/camera_proxy.cpp b/src/android/camera_proxy.cpp\nindex 43e1e1c3af53..3964b5665e2f 100644\n--- a/src/android/camera_proxy.cpp\n+++ b/src/android/camera_proxy.cpp\n@@ -16,7 +16,6 @@\n #include \"utils.h\"\n \n #include \"camera_device.h\"\n-#include \"thread_rpc.h\"\n \n using namespace libcamera;\n \n@@ -148,10 +147,8 @@ int CameraProxy::open(const hw_module_t *hardwareModule)\n \n void CameraProxy::close()\n {\n-\tThreadRpc rpcRequest;\n-\trpcRequest.tag = ThreadRpc::Close;\n-\n-\tthreadRpcCall(rpcRequest);\n+\tcameraDevice_->invokeMethod(&CameraDevice::close,\n+\t\t\t\t    ConnectionTypeBlocking);\n }\n \n void CameraProxy::initialize(const camera3_callback_ops_t *callbacks)\n@@ -176,18 +173,8 @@ int CameraProxy::configureStreams(camera3_stream_configuration_t *stream_list)\n \n int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)\n {\n-\tThreadRpc rpcRequest;\n-\trpcRequest.tag = ThreadRpc::ProcessCaptureRequest;\n-\trpcRequest.request = request;\n-\n-\tthreadRpcCall(rpcRequest);\n+\tcameraDevice_->invokeMethod(&CameraDevice::processCaptureRequest,\n+\t\t\t\t    ConnectionTypeBlocking, request);\n \n \treturn 0;\n }\n-\n-void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)\n-{\n-\tcameraDevice_->invokeMethod(&CameraDevice::call, ConnectionTypeQueued,\n-\t\t\t\t    &rpcRequest);\n-\trpcRequest.waitDelivery();\n-}\ndiff --git a/src/android/camera_proxy.h b/src/android/camera_proxy.h\nindex 7940eac4e376..e8cfbc9dd526 100644\n--- a/src/android/camera_proxy.h\n+++ b/src/android/camera_proxy.h\n@@ -14,7 +14,6 @@\n #include <libcamera/camera.h>\n \n class CameraDevice;\n-class ThreadRpc;\n \n class CameraProxy\n {\n@@ -35,8 +34,6 @@ public:\n \tcamera3_device_t *camera3Device() { return &camera3Device_; }\n \n private:\n-\tvoid threadRpcCall(ThreadRpc &rpcRequest);\n-\n \tunsigned int id_;\n \tCameraDevice *cameraDevice_;\n \tcamera3_device_t camera3Device_;\ndiff --git a/src/android/meson.build b/src/android/meson.build\nindex b5e4eeeb73a8..70dfcc1df27a 100644\n--- a/src/android/meson.build\n+++ b/src/android/meson.build\n@@ -4,7 +4,6 @@ android_hal_sources = files([\n     'camera_device.cpp',\n     'camera_metadata.cpp',\n     'camera_proxy.cpp',\n-    'thread_rpc.cpp'\n ])\n \n android_camera_metadata_sources = files([\ndiff --git a/src/android/thread_rpc.cpp b/src/android/thread_rpc.cpp\ndeleted file mode 100644\nindex f57891ff56bf..000000000000\n--- a/src/android/thread_rpc.cpp\n+++ /dev/null\n@@ -1,26 +0,0 @@\n-/* SPDX-License-Identifier: LGPL-2.1-or-later */\n-/*\n- * Copyright (C) 2019, Google Inc.\n- *\n- * thread_rpc.cpp - Inter-thread procedure call\n- */\n-\n-#include \"thread.h\"\n-#include \"thread_rpc.h\"\n-\n-using namespace libcamera;\n-\n-void ThreadRpc::notifyReception()\n-{\n-\t{\n-\t\tlibcamera::MutexLocker locker(mutex_);\n-\t\tdelivered_ = true;\n-\t}\n-\tcv_.notify_one();\n-}\n-\n-void ThreadRpc::waitDelivery()\n-{\n-\tlibcamera::MutexLocker locker(mutex_);\n-\tcv_.wait(locker, [&] { return delivered_; });\n-}\ndiff --git a/src/android/thread_rpc.h b/src/android/thread_rpc.h\ndeleted file mode 100644\nindex f577a5d9fb32..000000000000\n--- a/src/android/thread_rpc.h\n+++ /dev/null\n@@ -1,39 +0,0 @@\n-/* SPDX-License-Identifier: LGPL-2.1-or-later */\n-/*\n- * Copyright (C) 2019, Google Inc.\n- *\n- * thread_rpc.h - Inter-thread procedure call\n- */\n-#ifndef __ANDROID_THREAD_RPC_H__\n-#define __ANDROID_THREAD_RPC_H__\n-\n-#include <condition_variable>\n-#include <mutex>\n-\n-#include <hardware/camera3.h>\n-\n-class ThreadRpc\n-{\n-public:\n-\tenum RpcTag {\n-\t\tProcessCaptureRequest,\n-\t\tClose,\n-\t};\n-\n-\tThreadRpc()\n-\t\t: delivered_(false) {}\n-\n-\tvoid notifyReception();\n-\tvoid waitDelivery();\n-\n-\tRpcTag tag;\n-\n-\tcamera3_capture_request_t *request;\n-\n-private:\n-\tbool delivered_;\n-\tstd::mutex mutex_;\n-\tstd::condition_variable cv_;\n-};\n-\n-#endif /* __ANDROID_THREAD_RPC_H__ */\n","prefixes":["libcamera-devel","v2","9/9"]}