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