]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/DataFormatters/FormatCache.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / DataFormatters / FormatCache.cpp
1 //===-- FormatCache.cpp ------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "lldb/lldb-python.h"
11
12 // C Includes
13
14 // C++ Includes
15
16 // Other libraries and framework includes
17
18 // Project includes
19 #include "lldb/DataFormatters/FormatCache.h"
20
21 using namespace lldb;
22 using namespace lldb_private;
23
24 FormatCache::Entry::Entry () :
25 m_summary_cached(false),
26 m_synthetic_cached(false),
27 m_summary_sp(),
28 m_synthetic_sp()
29 {}
30
31 FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
32 m_synthetic_cached(false),
33 m_synthetic_sp()
34 {
35     SetSummary (summary_sp);
36 }
37
38 FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
39 m_summary_cached(false),
40 m_summary_sp()
41 {
42     SetSynthetic (synthetic_sp);
43 }
44
45 FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp)
46 {
47     SetSummary (summary_sp);
48     SetSynthetic (synthetic_sp);
49 }
50
51 bool
52 FormatCache::Entry::IsSummaryCached ()
53 {
54     return m_summary_cached;
55 }
56
57 bool
58 FormatCache::Entry::IsSyntheticCached ()
59 {
60     return m_synthetic_cached;
61 }
62
63 lldb::TypeSummaryImplSP
64 FormatCache::Entry::GetSummary ()
65 {
66     return m_summary_sp;
67 }
68
69 lldb::SyntheticChildrenSP
70 FormatCache::Entry::GetSynthetic ()
71 {
72     return m_synthetic_sp;
73 }
74
75 void
76 FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
77 {
78     m_summary_cached = true;
79     m_summary_sp = summary_sp;
80 }
81
82 void
83 FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
84 {
85     m_synthetic_cached = true;
86     m_synthetic_sp = synthetic_sp;
87 }
88
89 FormatCache::FormatCache () :
90 m_map(),
91 m_mutex (Mutex::eMutexTypeRecursive)
92 #ifdef LLDB_CONFIGURATION_DEBUG
93 ,m_cache_hits(0),m_cache_misses(0)
94 #endif
95 {
96 }
97
98 FormatCache::Entry&
99 FormatCache::GetEntry (const ConstString& type)
100 {
101     auto i = m_map.find(type),
102     e = m_map.end();
103     if (i != e)
104         return i->second;
105     m_map[type] = FormatCache::Entry();
106     return m_map[type];
107 }
108
109 bool
110 FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
111 {
112     Mutex::Locker lock(m_mutex);
113     auto entry = GetEntry(type);
114     if (entry.IsSummaryCached())
115     {
116 #ifdef LLDB_CONFIGURATION_DEBUG
117         m_cache_hits++;
118 #endif
119         summary_sp = entry.GetSummary();
120         return true;
121     }
122 #ifdef LLDB_CONFIGURATION_DEBUG
123     m_cache_misses++;
124 #endif
125     summary_sp.reset();
126     return false;
127 }
128
129 bool
130 FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
131 {
132     Mutex::Locker lock(m_mutex);
133     auto entry = GetEntry(type);
134     if (entry.IsSyntheticCached())
135     {
136 #ifdef LLDB_CONFIGURATION_DEBUG
137         m_cache_hits++;
138 #endif
139         synthetic_sp = entry.GetSynthetic();
140         return true;
141     }
142 #ifdef LLDB_CONFIGURATION_DEBUG
143     m_cache_misses++;
144 #endif
145     synthetic_sp.reset();
146     return false;
147 }
148
149 void
150 FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
151 {
152     Mutex::Locker lock(m_mutex);
153     GetEntry(type).SetSummary(summary_sp);
154 }
155
156 void
157 FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
158 {
159     Mutex::Locker lock(m_mutex);
160     GetEntry(type).SetSynthetic(synthetic_sp);
161 }
162
163 void
164 FormatCache::Clear ()
165 {
166     Mutex::Locker lock(m_mutex);
167     m_map.clear();
168 }
169