{"id":2237,"url":"https://patchwork.libcamera.org/api/1.1/patches/2237/?format=json","web_url":"https://patchwork.libcamera.org/patch/2237/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20191027203335.26888-7-jacopo@jmondi.org>","date":"2019-10-27T20:33:35","name":"[libcamera-devel,6/6] android: Replace ThreadRPC with blocking method call","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"57a9c6e34dc0850c975cda155e918a6a024b7819","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/1.1/people/3/?format=json","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/2237/mbox/","series":[{"id":558,"url":"https://patchwork.libcamera.org/api/1.1/series/558/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=558","date":"2019-10-27T20:33:29","name":"Add support for blocking method invocation","version":1,"mbox":"https://patchwork.libcamera.org/series/558/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/2237/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/2237/checks/","tags":{},"headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D3AF16150A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 27 Oct 2019 21:31:50 +0100 (CET)","from uno.localdomain (143.121.2.93.rev.sfr.net [93.2.121.143])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 84EB1C0007;\n\tSun, 27 Oct 2019 20:31:50 +0000 (UTC)"],"X-Originating-IP":"93.2.121.143","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"libcamera-devel@lists.libcamera.org","Date":"Sun, 27 Oct 2019 21:33:35 +0100","Message-Id":"<20191027203335.26888-7-jacopo@jmondi.org>","X-Mailer":"git-send-email 2.23.0","In-Reply-To":"<20191027203335.26888-1-jacopo@jmondi.org>","References":"<20191027203335.26888-1-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH 6/6] 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":"Sun, 27 Oct 2019 20:31:51 -0000"},"content":"Use 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>\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 5f8428cfddfb..a48d8d265328 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    InvocationTypeBlocking);\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    InvocationTypeBlocking, request);\n \n \treturn 0;\n }\n-\n-void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)\n-{\n-\tcameraDevice_->invokeMethod(&CameraDevice::call, InvocationTypeQueued,\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","6/6"]}