• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef BASE_THREADING_THREAD_ID_NAME_MANAGER_H_
6 #define BASE_THREADING_THREAD_ID_NAME_MANAGER_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "base/base_export.h"
12 #include "base/basictypes.h"
13 #include "base/synchronization/lock.h"
14 #include "base/threading/platform_thread.h"
15 
16 template <typename T> struct DefaultSingletonTraits;
17 
18 namespace base {
19 
20 class BASE_EXPORT ThreadIdNameManager {
21  public:
22   static ThreadIdNameManager* GetInstance();
23 
24   static const char* GetDefaultInternedString();
25 
26   // Register the mapping between a thread |id| and |handle|.
27   void RegisterThread(PlatformThreadHandle::Handle handle, PlatformThreadId id);
28 
29   // Set the name for the given id.
30   void SetName(PlatformThreadId id, const char* name);
31 
32   // Get the name for the given id.
33   const char* GetName(PlatformThreadId id);
34 
35   // Remove the name for the given id.
36   void RemoveName(PlatformThreadHandle::Handle handle, PlatformThreadId id);
37 
38  private:
39   friend struct DefaultSingletonTraits<ThreadIdNameManager>;
40 
41   typedef std::map<PlatformThreadId, PlatformThreadHandle::Handle>
42       ThreadIdToHandleMap;
43   typedef std::map<PlatformThreadHandle::Handle, std::string*>
44       ThreadHandleToInternedNameMap;
45   typedef std::map<std::string, std::string*> NameToInternedNameMap;
46 
47   ThreadIdNameManager();
48   ~ThreadIdNameManager();
49 
50   // lock_ protects the name_to_interned_name_, thread_id_to_handle_ and
51   // thread_handle_to_interned_name_ maps.
52   Lock lock_;
53 
54   NameToInternedNameMap name_to_interned_name_;
55   ThreadIdToHandleMap thread_id_to_handle_;
56   ThreadHandleToInternedNameMap thread_handle_to_interned_name_;
57 
58   // Treat the main process specially as there is no PlatformThreadHandle.
59   std::string* main_process_name_;
60   PlatformThreadId main_process_id_;
61 
62   DISALLOW_COPY_AND_ASSIGN(ThreadIdNameManager);
63 };
64 
65 }  // namespace base
66 
67 #endif  // BASE_THREADING_THREAD_ID_NAME_MANAGER_H_
68