[PATCH v3 4/6] libcamera: base: thread: Support dispatching for a specific receiver
Kieran Bingham
kieran.bingham at ideasonboard.com
Sat Mar 1 23:56:48 CET 2025
Quoting Milan Zamazal (2025-02-25 15:06:10)
> The Thread::dispatchMessage() function supports filtering messages based
> on their type. It can be useful to also dispatch only messages posted
> for a specific receiver. Add an optional receiver argument to the
> dispatchMessage() function to do so. When set to null (the default
> value), the behaviour of the function is not changed.
>
> This facility is actually used in followup patches.
>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
> ---
> include/libcamera/base/thread.h | 3 ++-
> src/libcamera/base/thread.cpp | 21 +++++++++++++--------
> 2 files changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
> index 3cbf6398..b9284c2c 100644
> --- a/include/libcamera/base/thread.h
> +++ b/include/libcamera/base/thread.h
> @@ -48,7 +48,8 @@ public:
>
> EventDispatcher *eventDispatcher();
>
> - void dispatchMessages(Message::Type type = Message::Type::None);
> + void dispatchMessages(Message::Type type = Message::Type::None,
> + Object *receiver = nullptr);
>
> protected:
> int exec();
> diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp
> index 319bfda9..4de356c7 100644
> --- a/src/libcamera/base/thread.cpp
> +++ b/src/libcamera/base/thread.cpp
> @@ -604,10 +604,12 @@ void Thread::removeMessages(Object *receiver)
> /**
> * \brief Dispatch posted messages for this thread
> * \param[in] type The message type
> + * \param[in] receiver The receiver whose messages to dispatch
> *
> - * 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.
> + * This function immediately dispatches all the messages of the given \a type
> + * previously posted to this thread for the \a receiver with postMessage(). If
> + * the \a type is Message::Type::None, all messages types are dispatched. If the
> + * \a receiver is null, messages to all receivers are dispatched.
> *
> * Messages shall only be dispatched from the current thread, typically within
> * the thread from the run() function. Calling this function outside of the
> @@ -617,7 +619,7 @@ void Thread::removeMessages(Object *receiver)
> * same thread from an object's message handler. It guarantees delivery of
> * messages in the order they have been posted in all cases.
> */
> -void Thread::dispatchMessages(Message::Type type)
> +void Thread::dispatchMessages(Message::Type type, Object *receiver)
> {
> ASSERT(data_ == ThreadData::current());
>
> @@ -634,6 +636,9 @@ void Thread::dispatchMessages(Message::Type type)
> if (type != Message::Type::None && msg->type() != type)
> continue;
>
> + if (receiver && receiver != msg->receiver_)
> + continue;
> +
> /*
> * Move the message, setting the entry in the list to null. It
> * will cause recursive calls to ignore the entry, and the erase
> @@ -641,12 +646,12 @@ void Thread::dispatchMessages(Message::Type type)
> */
> std::unique_ptr<Message> message = std::move(msg);
>
> - Object *receiver = message->receiver_;
> - ASSERT(data_ == receiver->thread()->data_);
> - receiver->pendingMessages_--;
> + Object *messageReceiver = message->receiver_;
> + ASSERT(data_ == messageReceiver->thread()->data_);
> + messageReceiver->pendingMessages_--;
>
> locker.unlock();
> - receiver->message(message.get());
> + messageReceiver->message(message.get());
> message.reset();
> locker.lock();
> }
> --
> 2.48.1
>
More information about the libcamera-devel
mailing list