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:
parent
778f6b1d70
commit
0c32433d8c
5 changed files with 8 additions and 45 deletions
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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_;
|
||||
}
|
||||
|
|
|
@ -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__ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue