android: Simplify thread RPC with Object::invokeMethod()

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@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2019-08-12 05:30:06 +03:00
parent 778f6b1d70
commit 0c32433d8c
5 changed files with 8 additions and 45 deletions

View file

@ -70,14 +70,8 @@ CameraDevice::~CameraDevice()
/* /*
* Handle RPC request received from the associated proxy. * 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) { switch (rpc->tag) {
case ThreadRpc::ProcessCaptureRequest: case ThreadRpc::ProcessCaptureRequest:
processCaptureRequest(rpc->request); processCaptureRequest(rpc->request);

View file

@ -26,13 +26,15 @@
return nullptr; \ return nullptr; \
} while(0); } while(0);
class ThreadRpc;
class CameraDevice : public libcamera::Object class CameraDevice : public libcamera::Object
{ {
public: public:
CameraDevice(unsigned int id, std::shared_ptr<libcamera::Camera> &camera); CameraDevice(unsigned int id, std::shared_ptr<libcamera::Camera> &camera);
~CameraDevice(); ~CameraDevice();
void message(libcamera::Message *message); void call(ThreadRpc *rpc);
int open(); int open();
void close(); void close();

View file

@ -9,6 +9,8 @@
#include <system/camera_metadata.h> #include <system/camera_metadata.h>
#include <libcamera/object.h>
#include "log.h" #include "log.h"
#include "message.h" #include "message.h"
#include "utils.h" #include "utils.h"
@ -185,10 +187,6 @@ int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)
void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest) void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)
{ {
std::unique_ptr<ThreadRpcMessage> message = cameraDevice_->invokeMethod(&CameraDevice::call, &rpcRequest);
utils::make_unique<ThreadRpcMessage>();
message->rpc = &rpcRequest;
cameraDevice_->postMessage(std::move(message));
rpcRequest.waitDelivery(); rpcRequest.waitDelivery();
} }

View file

@ -5,19 +5,11 @@
* thread_rpc.cpp - Inter-thread procedure call * thread_rpc.cpp - Inter-thread procedure call
*/ */
#include "thread.h"
#include "thread_rpc.h" #include "thread_rpc.h"
#include "message.h"
using namespace libcamera; using namespace libcamera;
libcamera::Message::Type ThreadRpcMessage::rpcType_ = Message::Type::None;
ThreadRpcMessage::ThreadRpcMessage()
: Message(type())
{
}
void ThreadRpc::notifyReception() void ThreadRpc::notifyReception()
{ {
{ {
@ -32,11 +24,3 @@ void ThreadRpc::waitDelivery()
libcamera::MutexLocker locker(mutex_); libcamera::MutexLocker locker(mutex_);
cv_.wait(locker, [&] { return delivered_; }); cv_.wait(locker, [&] { return delivered_; });
} }
Message::Type ThreadRpcMessage::type()
{
if (ThreadRpcMessage::rpcType_ == Message::Type::None)
rpcType_ = Message::registerMessageType();
return rpcType_;
}

View file

@ -12,9 +12,6 @@
#include <hardware/camera3.h> #include <hardware/camera3.h>
#include "message.h"
#include "thread.h"
class ThreadRpc class ThreadRpc
{ {
public: public:
@ -39,16 +36,4 @@ private:
std::condition_variable cv_; 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__ */ #endif /* __ANDROID_THREAD_RPC_H__ */