Use function-local static variable for MessageQueueManager singleton.
Rely on C++11 thread-safe initialization on first call to
MessageQueueManager::Instance(), in the same way as for
ThreadManager::Instance().
Bug: None
Change-Id: I26244f90c5d7f94a2454688297f55bf96617e78c
Reviewed-on: https://webrtc-review.googlesource.com/97721
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24625}
diff --git a/rtc_base/messagequeue.cc b/rtc_base/messagequeue.cc
index 6ff73b5..a561af4 100644
--- a/rtc_base/messagequeue.cc
+++ b/rtc_base/messagequeue.cc
@@ -48,18 +48,9 @@
//------------------------------------------------------------------
// MessageQueueManager
-MessageQueueManager* MessageQueueManager::instance_ = nullptr;
-
MessageQueueManager* MessageQueueManager::Instance() {
- // Note: This is not thread safe, but it is first called before threads are
- // spawned.
- if (!instance_)
- instance_ = new MessageQueueManager;
- return instance_;
-}
-
-bool MessageQueueManager::IsInitialized() {
- return instance_ != nullptr;
+ static MessageQueueManager* const instance = new MessageQueueManager;
+ return instance;
}
MessageQueueManager::MessageQueueManager() : processing_(0) {}
@@ -77,18 +68,9 @@
}
void MessageQueueManager::Remove(MessageQueue* message_queue) {
- // If there isn't a message queue manager instance, then there isn't a queue
- // to remove.
- if (!instance_)
- return;
return Instance()->RemoveInternal(message_queue);
}
void MessageQueueManager::RemoveInternal(MessageQueue* message_queue) {
- // If this is the last MessageQueue, destroy the manager as well so that
- // we don't leak this object at program shutdown. As mentioned above, this is
- // not thread-safe, but this should only happen at program termination (when
- // the ThreadManager is destroyed, and threads are no longer active).
- bool destroy = false;
{
CritScope cs(&crit_);
// Prevent changes while the list of message queues is processed.
@@ -99,19 +81,10 @@
if (iter != message_queues_.end()) {
message_queues_.erase(iter);
}
- destroy = message_queues_.empty();
- }
- if (destroy) {
- instance_ = nullptr;
- delete this;
}
}
void MessageQueueManager::Clear(MessageHandler* handler) {
- // If there isn't a message queue manager instance, then there aren't any
- // queues to remove this handler from.
- if (!instance_)
- return;
return Instance()->ClearInternal(handler);
}
void MessageQueueManager::ClearInternal(MessageHandler* handler) {
@@ -125,9 +98,6 @@
}
void MessageQueueManager::ProcessAllMessageQueuesForTesting() {
- if (!instance_) {
- return;
- }
return Instance()->ProcessAllMessageQueuesInternal();
}
@@ -225,7 +195,7 @@
// is going away.
SignalQueueDestroyed();
MessageQueueManager::Remove(this);
- Clear(nullptr);
+ ClearInternal(nullptr, MQID_ANY, nullptr);
if (ss_) {
ss_->SetMessageQueue(nullptr);
@@ -480,7 +450,12 @@
uint32_t id,
MessageList* removed) {
CritScope cs(&crit_);
+ ClearInternal(phandler, id, removed);
+}
+void MessageQueue::ClearInternal(MessageHandler* phandler,
+ uint32_t id,
+ MessageList* removed) {
// Remove messages with phandler
if (fPeekKeep_ && msgPeek_.Match(phandler, id)) {