| Index: webrtc/base/messagequeue.cc
|
| diff --git a/webrtc/base/messagequeue.cc b/webrtc/base/messagequeue.cc
|
| index ebf98f58a34e3539a85bb4068bddadf8eab9c678..503d5aff966bde3354352173891fe93e91350ce6 100644
|
| --- a/webrtc/base/messagequeue.cc
|
| +++ b/webrtc/base/messagequeue.cc
|
| @@ -126,17 +126,34 @@ void MessageQueueManager::ProcessAllMessageQueues() {
|
| }
|
|
|
| void MessageQueueManager::ProcessAllMessageQueuesInternal() {
|
| - // Post a delayed message at the current time and wait for it to be dispatched
|
| - // on all queues, which will ensure that all messages that came before it were
|
| - // also dispatched.
|
| - volatile int queues_not_done;
|
| - auto functor = [&queues_not_done] { AtomicOps::Decrement(&queues_not_done); };
|
| - FunctorMessageHandler<void, decltype(functor)> handler(functor);
|
| + // This works by posting a delayed message at the current time and waiting
|
| + // for it to be dispatched on all queues, which will ensure that all messages
|
| + // that came before it were also dispatched.
|
| + volatile int queues_not_done = 0;
|
| +
|
| + // This class is used so that whether the posted message is processed, or the
|
| + // message queue is simply cleared, queues_not_done gets decremented.
|
| + class ScopedIncrement : public MessageData {
|
| + public:
|
| + ScopedIncrement(volatile int* value) : value_(value) {
|
| + AtomicOps::Increment(value_);
|
| + }
|
| + ~ScopedIncrement() override { AtomicOps::Decrement(value_); }
|
| +
|
| + private:
|
| + volatile int* value_;
|
| + };
|
| +
|
| {
|
| DebugNonReentrantCritScope cs(&crit_, &locked_);
|
| - queues_not_done = static_cast<int>(message_queues_.size());
|
| for (MessageQueue* queue : message_queues_) {
|
| - queue->PostDelayed(RTC_FROM_HERE, 0, &handler);
|
| + if (queue->IsQuitting()) {
|
| + // If the queue is quitting, it's done processing messages so it can
|
| + // be ignored. If we tried to post a message to it, it would be dropped.
|
| + continue;
|
| + }
|
| + queue->PostDelayed(RTC_FROM_HERE, 0, nullptr, MQID_DISPOSE,
|
| + new ScopedIncrement(&queues_not_done));
|
| }
|
| }
|
| // Note: One of the message queues may have been on this thread, which is why
|
|
|