diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libcamera/thread.cpp | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp index d1750d72..87006a9c 100644 --- a/src/libcamera/thread.cpp +++ b/src/libcamera/thread.cpp @@ -552,25 +552,42 @@ 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) { + iter = data_->messages_.list_.erase(iter); + continue; + } + + if (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(); } } |