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.
*/
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);

View file

@ -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();

View file

@ -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();
}

View file

@ -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_;
}

View file

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