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.
|
* 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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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__ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue