| // 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_ |