[libcamera-devel] [PATCH v3 1/3] libcamera: thread: Support selective message dispatch to thread
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Jul 31 16:22:40 CEST 2020
Hi Umang,
Thank you for the patch.
On Fri, Jul 31, 2020 at 01:39:53PM +0000, Umang Jain wrote:
> Extend the current dispatchMessages() to support dispatching of
> selective messsages according to the Message::Type passed in
> the function argument. dispatchMessages() can now be called
> explicitly to force deliver selected type's message to the
> thread for processing (typically when event loop is not
> running).
>
> Signed-off-by: Umang Jain <email at uajain.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> include/libcamera/internal/thread.h | 3 ++-
> src/libcamera/thread.cpp | 30 ++++++++++++++++++++---------
> 2 files changed, 23 insertions(+), 10 deletions(-)
>
> diff --git a/include/libcamera/internal/thread.h b/include/libcamera/internal/thread.h
> index 7b59e58..f6367a8 100644
> --- a/include/libcamera/internal/thread.h
> +++ b/include/libcamera/internal/thread.h
> @@ -14,6 +14,7 @@
>
> #include <libcamera/signal.h>
>
> +#include "libcamera/internal/message.h"
> #include "libcamera/internal/utils.h"
>
> namespace libcamera {
> @@ -47,7 +48,7 @@ public:
> EventDispatcher *eventDispatcher();
> void setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);
>
> - void dispatchMessages();
> + void dispatchMessages(Message::Type type = Message::Type::None);
>
> protected:
> int exec();
> diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp
> index d1750d7..7e318d9 100644
> --- a/src/libcamera/thread.cpp
> +++ b/src/libcamera/thread.cpp
> @@ -552,25 +552,37 @@ void Thread::removeMessages(Object *receiver)
> }
>
> /**
> - * \brief Dispatch all posted messages for this thread
> + * \brief Dispatch posted messages for this thread
> + * \param[in] type The message type
> + *
> + * This function immediately dispatches all the messages previously posted for
> + * this thread with postMessage() that match the message \a type. If the \a type
> + * is Message::Type::None, all messages are dispatched.
> */
> -void Thread::dispatchMessages()
> +void Thread::dispatchMessages(Message::Type type)
> {
> MutexLocker locker(data_->messages_.mutex_);
>
> - while (!data_->messages_.list_.empty()) {
> - std::unique_ptr<Message> msg = std::move(data_->messages_.list_.front());
> - data_->messages_.list_.pop_front();
> - if (!msg)
> + std::list<std::unique_ptr<Message>> &messages = data_->messages_.list_;
> +
> + for (auto iter = messages.begin(); iter != messages.end(); ) {
> + std::unique_ptr<Message> &msg = *iter;
> +
> + if (!msg || (type != Message::Type::None && msg->type() != type)) {
> + ++iter;
> continue;
> + }
>
> - Object *receiver = msg->receiver_;
> - ASSERT(data_ == receiver->thread()->data_);
> + std::unique_ptr<Message> message = std::move(msg);
> + iter = data_->messages_.list_.erase(iter);
>
> + Object *receiver = message->receiver_;
> + ASSERT(data_ == receiver->thread()->data_);
> receiver->pendingMessages_--;
>
> locker.unlock();
> - receiver->message(msg.get());
> + receiver->message(message.get());
> + message.reset();
> locker.lock();
> }
> }
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list