Index: base/threading/thread_id_name_manager.cc |
diff --git a/base/threading/thread_id_name_manager.cc b/base/threading/thread_id_name_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..477e849602ec9f2fe6ba142926b0cf1cfc1e3055 |
--- /dev/null |
+++ b/base/threading/thread_id_name_manager.cc |
@@ -0,0 +1,68 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/threading/thread_id_name_manager.h" |
+ |
+#include <stdlib.h> |
+#include <string.h> |
+ |
+#include "base/logging.h" |
+#include "base/memory/singleton.h" |
+#include "base/string_util.h" |
+ |
+namespace base { |
+namespace { |
+ |
+const char* kDefaultName(""); |
+ |
+typedef std::map<PlatformThreadId, std::string>::iterator |
+ IdToInternedNameIterator; |
+typedef std::map<std::string, std::string>::iterator NameToInternedNameIterator; |
+} |
+ |
+ThreadIdNameManager::ThreadIdNameManager() { |
+ name_to_interned_name_[kDefaultName] = kDefaultName; |
+} |
+ |
+ThreadIdNameManager::~ThreadIdNameManager() { |
+} |
+ |
+ThreadIdNameManager* ThreadIdNameManager::GetInstance() { |
+ return Singleton<ThreadIdNameManager, |
+ LeakySingletonTraits<ThreadIdNameManager> >::get(); |
+} |
+ |
+const char* ThreadIdNameManager::GetDefaultInternedString() { |
+ return kDefaultName; |
+} |
+ |
+void ThreadIdNameManager::SetNameForId(PlatformThreadId id, const char* name) { |
+ std::string str_name(name); |
+ |
+ AutoLock locked(lock_); |
+ NameToInternedNameIterator iter = name_to_interned_name_.find(str_name); |
+ if (iter == name_to_interned_name_.end()) |
+ name_to_interned_name_[str_name] = str_name; |
jar (doing other things)
2013/01/24 01:05:14
I'm a little confused now, as you set values into
dsinclair
2013/01/24 15:13:06
Bug, I should have used iter->second in the assign
|
+ |
+ id_to_interned_name_[id] = str_name; |
jar (doing other things)
2013/01/24 01:05:14
nit: suggest thread_id_to_interned_name
I was con
dsinclair
2013/01/24 15:13:06
Done.
|
+} |
+ |
+const char* ThreadIdNameManager::GetNameForId(PlatformThreadId id) { |
jar (doing other things)
2013/01/24 01:05:14
nit: Clearer might be GetNameForThread(...), or po
dsinclair
2013/01/24 15:13:06
Done.
|
+ AutoLock locked(lock_); |
+ IdToInternedNameIterator iter = id_to_interned_name_.find(id); |
+ DCHECK(iter != id_to_interned_name_.end()); |
+ return iter->second.c_str(); |
jar (doing other things)
2013/01/24 01:05:14
This sort of return tends to suggest that the stri
dsinclair
2013/01/24 15:13:06
This should be long lived as it will continue to l
|
+} |
+ |
+void ThreadIdNameManager::RemoveNameForId(PlatformThreadId id) { |
+ if (id == kInvalidThreadId) |
+ return; |
+ |
+ AutoLock locked(lock_); |
+ IdToInternedNameIterator iter = id_to_interned_name_.find(id); |
+ DCHECK((iter != id_to_interned_name_.end())); |
+ id_to_interned_name_.erase(iter); |
+} |
+ |
+} // namespace base |