[libcamera-devel] [PATCH v2 4/9] libcamera: bound_method: Support connection types
Niklas Söderlund
niklas.soderlund at ragnatech.se
Tue Oct 29 15:41:27 CET 2019
Hi Laurent,
Thanks for your work.
On 2019-10-28 12:49:08 +0200, Laurent Pinchart wrote:
> Support all connection types in the BoundMethodBase::activePack()
> method. To support this, add a semaphore to the InvokeMessage to signal
> delivery.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> src/libcamera/bound_method.cpp | 30 ++++++++++++++++++++++++++++--
> src/libcamera/include/message.h | 5 +++++
> src/libcamera/message.cpp | 11 +++++++++--
> src/libcamera/object.cpp | 8 +++++++-
> 4 files changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/src/libcamera/bound_method.cpp b/src/libcamera/bound_method.cpp
> index ab6ecd9423d1..600717363444 100644
> --- a/src/libcamera/bound_method.cpp
> +++ b/src/libcamera/bound_method.cpp
> @@ -8,6 +8,7 @@
> #include <libcamera/bound_method.h>
>
> #include "message.h"
> +#include "semaphore.h"
> #include "thread.h"
> #include "utils.h"
>
> @@ -49,12 +50,37 @@ namespace libcamera {
>
> void BoundMethodBase::activatePack(void *pack)
> {
> - if (Thread::current() == object_->thread()) {
> + ConnectionType type = connectionType_;
> + if (type == ConnectionTypeAuto) {
> + if (Thread::current() == object_->thread())
> + type = ConnectionTypeDirect;
> + else
> + type = ConnectionTypeQueued;
> + }
> +
> + switch (type) {
> + case ConnectionTypeDirect:
> + default:
> invokePack(pack);
> - } else {
> + break;
> +
> + case ConnectionTypeQueued: {
> std::unique_ptr<Message> msg =
> utils::make_unique<InvokeMessage>(this, pack);
> object_->postMessage(std::move(msg));
> + break;
> + }
> +
> + case ConnectionTypeBlocking: {
> + Semaphore semaphore;
> +
> + std::unique_ptr<Message> msg =
> + utils::make_unique<InvokeMessage>(this, pack, &semaphore);
> + object_->postMessage(std::move(msg));
> +
> + semaphore.acquire();
> + break;
> + }
> }
> }
>
> diff --git a/src/libcamera/include/message.h b/src/libcamera/include/message.h
> index 1cfde5669ede..311755cc60fe 100644
> --- a/src/libcamera/include/message.h
> +++ b/src/libcamera/include/message.h
> @@ -15,6 +15,7 @@ namespace libcamera {
>
> class BoundMethodBase;
> class Object;
> +class Semaphore;
> class Thread;
>
> class Message
> @@ -48,14 +49,18 @@ class InvokeMessage : public Message
> {
> public:
> InvokeMessage(BoundMethodBase *method, void *pack,
> + Semaphore *semaphore = nullptr,
> bool deleteMethod = false);
> ~InvokeMessage();
>
> + Semaphore *semaphore() const { return semaphore_; }
> +
> void invoke();
>
> private:
> BoundMethodBase *method_;
> void *pack_;
> + Semaphore *semaphore_;
> bool deleteMethod_;
> };
>
> diff --git a/src/libcamera/message.cpp b/src/libcamera/message.cpp
> index efafb655c17e..daf653221077 100644
> --- a/src/libcamera/message.cpp
> +++ b/src/libcamera/message.cpp
> @@ -119,13 +119,14 @@ Message::Type Message::registerMessageType()
> * \brief Construct an InvokeMessage for method invocation on an Object
> * \param[in] method The bound method
> * \param[in] pack The packed method arguments
> + * \param[in] semaphore The semaphore used to signal message delivery
> * \param[in] deleteMethod True to delete the \a method when the message is
> * destroyed
> */
> InvokeMessage::InvokeMessage(BoundMethodBase *method, void *pack,
> - bool deleteMethod)
> + Semaphore *semaphore, bool deleteMethod)
> : Message(Message::InvokeMessage), method_(method), pack_(pack),
> - deleteMethod_(deleteMethod)
> + semaphore_(semaphore), deleteMethod_(deleteMethod)
> {
> }
>
> @@ -135,6 +136,12 @@ InvokeMessage::~InvokeMessage()
> delete method_;
> }
>
> +/**
> + * \fn InvokeMessage::semaphore()
> + * \brief Retrieve the message semaphore passed to the constructor
> + * \return The message semaphore
> + */
> +
> /**
> * \brief Invoke the method bound to InvokeMessage::method_ with arguments
> * InvokeMessage::pack_
> diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp
> index 98aa0af2f9b9..b0818f9aa25f 100644
> --- a/src/libcamera/object.cpp
> +++ b/src/libcamera/object.cpp
> @@ -13,6 +13,7 @@
>
> #include "log.h"
> #include "message.h"
> +#include "semaphore.h"
> #include "thread.h"
> #include "utils.h"
>
> @@ -123,7 +124,12 @@ void Object::message(Message *msg)
> switch (msg->type()) {
> case Message::InvokeMessage: {
> InvokeMessage *iMsg = static_cast<InvokeMessage *>(msg);
> + Semaphore *semaphore = iMsg->semaphore();
> iMsg->invoke();
> +
> + if (semaphore)
> + semaphore->release();
> +
> break;
> }
>
> @@ -150,7 +156,7 @@ void Object::message(Message *msg)
> void Object::invokeMethod(BoundMethodBase *method, void *args)
> {
> std::unique_ptr<Message> msg =
> - utils::make_unique<InvokeMessage>(method, args, true);
> + utils::make_unique<InvokeMessage>(method, args, nullptr, true);
> postMessage(std::move(msg));
> }
>
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list