15548cb50SEnrico Granata //===-- FormatCache.cpp ------------------------------------------*- C++ -*-===//
25548cb50SEnrico Granata //
35548cb50SEnrico Granata //                     The LLVM Compiler Infrastructure
45548cb50SEnrico Granata //
55548cb50SEnrico Granata // This file is distributed under the University of Illinois Open Source
65548cb50SEnrico Granata // License. See LICENSE.TXT for details.
75548cb50SEnrico Granata //
85548cb50SEnrico Granata //===----------------------------------------------------------------------===//
95548cb50SEnrico Granata 
105548cb50SEnrico Granata // C Includes
115548cb50SEnrico Granata 
125548cb50SEnrico Granata // C++ Includes
135548cb50SEnrico Granata 
145548cb50SEnrico Granata // Other libraries and framework includes
155548cb50SEnrico Granata 
165548cb50SEnrico Granata // Project includes
175548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h"
185548cb50SEnrico Granata 
195548cb50SEnrico Granata using namespace lldb;
205548cb50SEnrico Granata using namespace lldb_private;
215548cb50SEnrico Granata 
225548cb50SEnrico Granata FormatCache::Entry::Entry () :
235548cb50SEnrico Granata m_summary_cached(false),
245548cb50SEnrico Granata m_synthetic_cached(false),
2530b95a36SDaniel Malea m_summary_sp(),
2630b95a36SDaniel Malea m_synthetic_sp()
275548cb50SEnrico Granata {}
285548cb50SEnrico Granata 
29*0b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
30*0b464d48SDaniel Malea m_synthetic_cached(false),
31*0b464d48SDaniel Malea m_synthetic_sp()
325548cb50SEnrico Granata {
335548cb50SEnrico Granata     SetSummary (summary_sp);
345548cb50SEnrico Granata }
355548cb50SEnrico Granata 
36*0b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
37*0b464d48SDaniel Malea m_summary_cached(false),
38*0b464d48SDaniel Malea m_summary_sp()
395548cb50SEnrico Granata {
405548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
415548cb50SEnrico Granata }
425548cb50SEnrico Granata 
43*0b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp)
445548cb50SEnrico Granata {
455548cb50SEnrico Granata     SetSummary (summary_sp);
465548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
475548cb50SEnrico Granata }
485548cb50SEnrico Granata 
495548cb50SEnrico Granata bool
505548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached ()
515548cb50SEnrico Granata {
525548cb50SEnrico Granata     return m_summary_cached;
535548cb50SEnrico Granata }
545548cb50SEnrico Granata 
555548cb50SEnrico Granata bool
565548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached ()
575548cb50SEnrico Granata {
585548cb50SEnrico Granata     return m_synthetic_cached;
595548cb50SEnrico Granata }
605548cb50SEnrico Granata 
615548cb50SEnrico Granata lldb::TypeSummaryImplSP
625548cb50SEnrico Granata FormatCache::Entry::GetSummary ()
635548cb50SEnrico Granata {
645548cb50SEnrico Granata     return m_summary_sp;
655548cb50SEnrico Granata }
665548cb50SEnrico Granata 
675548cb50SEnrico Granata lldb::SyntheticChildrenSP
685548cb50SEnrico Granata FormatCache::Entry::GetSynthetic ()
695548cb50SEnrico Granata {
705548cb50SEnrico Granata     return m_synthetic_sp;
715548cb50SEnrico Granata }
725548cb50SEnrico Granata 
735548cb50SEnrico Granata void
745548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
755548cb50SEnrico Granata {
765548cb50SEnrico Granata     m_summary_cached = true;
775548cb50SEnrico Granata     m_summary_sp = summary_sp;
785548cb50SEnrico Granata }
795548cb50SEnrico Granata 
805548cb50SEnrico Granata void
815548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
825548cb50SEnrico Granata {
835548cb50SEnrico Granata     m_synthetic_cached = true;
845548cb50SEnrico Granata     m_synthetic_sp = synthetic_sp;
855548cb50SEnrico Granata }
865548cb50SEnrico Granata 
875548cb50SEnrico Granata FormatCache::FormatCache () :
885548cb50SEnrico Granata m_map(),
895548cb50SEnrico Granata m_mutex (Mutex::eMutexTypeRecursive)
905548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
915548cb50SEnrico Granata ,m_cache_hits(0),m_cache_misses(0)
925548cb50SEnrico Granata #endif
935548cb50SEnrico Granata {
945548cb50SEnrico Granata }
955548cb50SEnrico Granata 
965548cb50SEnrico Granata FormatCache::Entry&
975548cb50SEnrico Granata FormatCache::GetEntry (const ConstString& type)
985548cb50SEnrico Granata {
995548cb50SEnrico Granata     auto i = m_map.find(type),
1005548cb50SEnrico Granata     e = m_map.end();
1015548cb50SEnrico Granata     if (i != e)
1025548cb50SEnrico Granata         return i->second;
1035548cb50SEnrico Granata     m_map[type] = FormatCache::Entry();
1045548cb50SEnrico Granata     return m_map[type];
1055548cb50SEnrico Granata }
1065548cb50SEnrico Granata 
1075548cb50SEnrico Granata bool
1085548cb50SEnrico Granata FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
1095548cb50SEnrico Granata {
1105548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1115548cb50SEnrico Granata     auto entry = GetEntry(type);
1125548cb50SEnrico Granata     if (entry.IsSummaryCached())
1135548cb50SEnrico Granata     {
1145548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1155548cb50SEnrico Granata         m_cache_hits++;
1165548cb50SEnrico Granata #endif
1175548cb50SEnrico Granata         summary_sp = entry.GetSummary();
1185548cb50SEnrico Granata         return true;
1195548cb50SEnrico Granata     }
1205548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1215548cb50SEnrico Granata     m_cache_misses++;
1225548cb50SEnrico Granata #endif
1235548cb50SEnrico Granata     summary_sp.reset();
1245548cb50SEnrico Granata     return false;
1255548cb50SEnrico Granata }
1265548cb50SEnrico Granata 
1275548cb50SEnrico Granata bool
1285548cb50SEnrico Granata FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
1295548cb50SEnrico Granata {
1305548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1315548cb50SEnrico Granata     auto entry = GetEntry(type);
1325548cb50SEnrico Granata     if (entry.IsSyntheticCached())
1335548cb50SEnrico Granata     {
1345548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1355548cb50SEnrico Granata         m_cache_hits++;
1365548cb50SEnrico Granata #endif
1375548cb50SEnrico Granata         synthetic_sp = entry.GetSynthetic();
1385548cb50SEnrico Granata         return true;
1395548cb50SEnrico Granata     }
1405548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1415548cb50SEnrico Granata     m_cache_misses++;
1425548cb50SEnrico Granata #endif
1435548cb50SEnrico Granata     synthetic_sp.reset();
1445548cb50SEnrico Granata     return false;
1455548cb50SEnrico Granata }
1465548cb50SEnrico Granata 
1475548cb50SEnrico Granata void
1485548cb50SEnrico Granata FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
1495548cb50SEnrico Granata {
1505548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1515548cb50SEnrico Granata     GetEntry(type).SetSummary(summary_sp);
1525548cb50SEnrico Granata }
1535548cb50SEnrico Granata 
1545548cb50SEnrico Granata void
1555548cb50SEnrico Granata FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
1565548cb50SEnrico Granata {
1575548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1585548cb50SEnrico Granata     GetEntry(type).SetSynthetic(synthetic_sp);
1595548cb50SEnrico Granata }
1605548cb50SEnrico Granata 
1615548cb50SEnrico Granata void
1625548cb50SEnrico Granata FormatCache::Clear ()
1635548cb50SEnrico Granata {
1645548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1655548cb50SEnrico Granata     m_map.clear();
1665548cb50SEnrico Granata }
1675548cb50SEnrico Granata 
168