|  | // 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. | 
|  |  | 
|  | #ifndef BASE_THREADING_THREAD_ID_NAME_MANAGER_H_ | 
|  | #define BASE_THREADING_THREAD_ID_NAME_MANAGER_H_ | 
|  |  | 
|  | #include <map> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/synchronization/lock.h" | 
|  | #include "base/threading/platform_thread.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | template <typename T> | 
|  | struct DefaultSingletonTraits; | 
|  |  | 
|  | class BASE_EXPORT ThreadIdNameManager { | 
|  | public: | 
|  | static ThreadIdNameManager* GetInstance(); | 
|  |  | 
|  | static const char* GetDefaultInternedString(); | 
|  |  | 
|  | // Register the mapping between a thread |id| and |handle|. | 
|  | void RegisterThread(PlatformThreadHandle::Handle handle, PlatformThreadId id); | 
|  |  | 
|  | // The callback is called on the thread, immediately after the name is set. | 
|  | // |name| is a pointer to a C string that is guaranteed to remain valid for | 
|  | // the duration of the process. | 
|  | using SetNameCallback = base::RepeatingCallback<void(const char* name)>; | 
|  | void InstallSetNameCallback(SetNameCallback callback); | 
|  |  | 
|  | // Set the name for the current thread. | 
|  | void SetName(const std::string& name); | 
|  |  | 
|  | // Get the name for the given id. | 
|  | const char* GetName(PlatformThreadId id); | 
|  |  | 
|  | // Unlike |GetName|, this method using TLS and avoids touching |lock_|. | 
|  | const char* GetNameForCurrentThread(); | 
|  |  | 
|  | // Remove the name for the given id. | 
|  | void RemoveName(PlatformThreadHandle::Handle handle, PlatformThreadId id); | 
|  |  | 
|  | private: | 
|  | friend struct DefaultSingletonTraits<ThreadIdNameManager>; | 
|  |  | 
|  | typedef std::map<PlatformThreadId, PlatformThreadHandle::Handle> | 
|  | ThreadIdToHandleMap; | 
|  | typedef std::map<PlatformThreadHandle::Handle, std::string*> | 
|  | ThreadHandleToInternedNameMap; | 
|  | typedef std::map<std::string, std::string*> NameToInternedNameMap; | 
|  |  | 
|  | ThreadIdNameManager(); | 
|  | ~ThreadIdNameManager(); | 
|  |  | 
|  | // lock_ protects the name_to_interned_name_, thread_id_to_handle_ and | 
|  | // thread_handle_to_interned_name_ maps. | 
|  | Lock lock_; | 
|  |  | 
|  | NameToInternedNameMap name_to_interned_name_; | 
|  | ThreadIdToHandleMap thread_id_to_handle_; | 
|  | ThreadHandleToInternedNameMap thread_handle_to_interned_name_; | 
|  |  | 
|  | // Treat the main process specially as there is no PlatformThreadHandle. | 
|  | std::string* main_process_name_; | 
|  | PlatformThreadId main_process_id_; | 
|  |  | 
|  | SetNameCallback set_name_callback_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ThreadIdNameManager); | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_THREADING_THREAD_ID_NAME_MANAGER_H_ |