Chromium Code Reviews| Index: base/debug/trace_event.cc |
| diff --git a/base/debug/trace_event.cc b/base/debug/trace_event.cc |
| index bf59f91e91d0b7e58a99cf47fca2a9a2f22a838b..c659ed2b58e2a2b1bce245a02edaf49f77f06c20 100644 |
| --- a/base/debug/trace_event.cc |
| +++ b/base/debug/trace_event.cc |
| @@ -12,8 +12,10 @@ |
| #include "base/bind.h" |
| #include "base/format_macros.h" |
| #include "base/lazy_instance.h" |
| +#include "base/memory/singleton.h" |
| #include "base/process_util.h" |
| #include "base/stringprintf.h" |
| +#include "base/threading/platform_thread.h" |
| #include "base/threading/thread_local.h" |
| #include "base/utf_string_conversions.h" |
| #include "base/stl_util.h" |
| @@ -54,10 +56,10 @@ const TraceCategory* const g_category_metadata = |
| &g_categories[2]; |
| int g_category_index = 3; // skip initial 3 categories |
| -// Flag to indicate whether we captured the current thread name |
| -LazyInstance<ThreadLocalBoolean, |
| - LeakyLazyInstanceTraits<ThreadLocalBoolean> > |
| - g_current_thread_name_captured(LINKER_INITIALIZED); |
| +// The most-recently captured name of the current thread |
| +LazyInstance<ThreadLocalPointer<char>, |
| + LeakyLazyInstanceTraits<ThreadLocalPointer<char> > > |
| + g_current_thread_name(LINKER_INITIALIZED); |
| } // namespace |
| @@ -513,27 +515,27 @@ int TraceLog::AddTraceEvent(TraceEventPhase phase, |
| PlatformThreadId thread_id = PlatformThread::CurrentId(); |
| - // Record the name of the calling thread, if not done already. |
| - if (!g_current_thread_name_captured.Pointer()->Get()) { |
| - g_current_thread_name_captured.Pointer()->Set(true); |
| - const char* cur_name = PlatformThread::GetName(); |
| + const char* cur_name = PlatformThread::GetName(); |
| + if (cur_name && *cur_name && |
|
jbates
2011/11/08 18:44:38
Since the steady state is (cur_name == g_current_t
nduca
2011/11/09 04:02:24
If we do that, we might want to explain the logic,
joth
2011/11/09 13:17:58
Done.
joth
2011/11/09 13:17:58
Done.
|
| + cur_name != g_current_thread_name.Get().Get()) { |
| + // Benign const cast. |
| + g_current_thread_name.Get().Set(const_cast<char*>(cur_name)); |
| base::hash_map<PlatformThreadId, std::string>::iterator existing_name = |
| thread_names_.find(thread_id); |
| if (existing_name == thread_names_.end()) { |
| // This is a new thread id, and a new name. |
| - thread_names_[thread_id] = cur_name ? cur_name : ""; |
| - } else if(cur_name != NULL) { |
| + thread_names_[thread_id] = cur_name; |
| + } else { |
| // This is a thread id that we've seen before, but potentially with a |
| // new name. |
| - std::vector<std::string> existing_names; |
| + std::vector<base::StringPiece> existing_names; |
| Tokenize(existing_name->second, std::string(","), &existing_names); |
| bool found = std::find(existing_names.begin(), |
| existing_names.end(), |
| cur_name) != existing_names.end(); |
| if (!found) { |
| - existing_names.push_back(cur_name); |
| - thread_names_[thread_id] = |
| - JoinString(existing_names, ','); |
| + existing_name->second.push_back(','); |
| + existing_name->second.append(cur_name); |
| } |
| } |
| } |