summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/thread.cpp35
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();
}
}