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),
25*30b95a36SDaniel Malea m_summary_sp(),
26*30b95a36SDaniel Malea m_synthetic_sp()
275548cb50SEnrico Granata {}
285548cb50SEnrico Granata 
295548cb50SEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) : FormatCache::Entry()
305548cb50SEnrico Granata {
315548cb50SEnrico Granata     SetSummary (summary_sp);
325548cb50SEnrico Granata }
335548cb50SEnrico Granata 
345548cb50SEnrico Granata FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) : FormatCache::Entry()
355548cb50SEnrico Granata {
365548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
375548cb50SEnrico Granata }
385548cb50SEnrico Granata 
395548cb50SEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp) : FormatCache::Entry()
405548cb50SEnrico Granata {
415548cb50SEnrico Granata     SetSummary (summary_sp);
425548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
435548cb50SEnrico Granata }
445548cb50SEnrico Granata 
455548cb50SEnrico Granata bool
465548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached ()
475548cb50SEnrico Granata {
485548cb50SEnrico Granata     return m_summary_cached;
495548cb50SEnrico Granata }
505548cb50SEnrico Granata 
515548cb50SEnrico Granata bool
525548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached ()
535548cb50SEnrico Granata {
545548cb50SEnrico Granata     return m_synthetic_cached;
555548cb50SEnrico Granata }
565548cb50SEnrico Granata 
575548cb50SEnrico Granata lldb::TypeSummaryImplSP
585548cb50SEnrico Granata FormatCache::Entry::GetSummary ()
595548cb50SEnrico Granata {
605548cb50SEnrico Granata     return m_summary_sp;
615548cb50SEnrico Granata }
625548cb50SEnrico Granata 
635548cb50SEnrico Granata lldb::SyntheticChildrenSP
645548cb50SEnrico Granata FormatCache::Entry::GetSynthetic ()
655548cb50SEnrico Granata {
665548cb50SEnrico Granata     return m_synthetic_sp;
675548cb50SEnrico Granata }
685548cb50SEnrico Granata 
695548cb50SEnrico Granata void
705548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
715548cb50SEnrico Granata {
725548cb50SEnrico Granata     m_summary_cached = true;
735548cb50SEnrico Granata     m_summary_sp = summary_sp;
745548cb50SEnrico Granata }
755548cb50SEnrico Granata 
765548cb50SEnrico Granata void
775548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
785548cb50SEnrico Granata {
795548cb50SEnrico Granata     m_synthetic_cached = true;
805548cb50SEnrico Granata     m_synthetic_sp = synthetic_sp;
815548cb50SEnrico Granata }
825548cb50SEnrico Granata 
835548cb50SEnrico Granata FormatCache::FormatCache () :
845548cb50SEnrico Granata m_map(),
855548cb50SEnrico Granata m_mutex (Mutex::eMutexTypeRecursive)
865548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
875548cb50SEnrico Granata ,m_cache_hits(0),m_cache_misses(0)
885548cb50SEnrico Granata #endif
895548cb50SEnrico Granata {
905548cb50SEnrico Granata }
915548cb50SEnrico Granata 
925548cb50SEnrico Granata FormatCache::Entry&
935548cb50SEnrico Granata FormatCache::GetEntry (const ConstString& type)
945548cb50SEnrico Granata {
955548cb50SEnrico Granata     auto i = m_map.find(type),
965548cb50SEnrico Granata     e = m_map.end();
975548cb50SEnrico Granata     if (i != e)
985548cb50SEnrico Granata         return i->second;
995548cb50SEnrico Granata     m_map[type] = FormatCache::Entry();
1005548cb50SEnrico Granata     return m_map[type];
1015548cb50SEnrico Granata }
1025548cb50SEnrico Granata 
1035548cb50SEnrico Granata bool
1045548cb50SEnrico Granata FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
1055548cb50SEnrico Granata {
1065548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1075548cb50SEnrico Granata     auto entry = GetEntry(type);
1085548cb50SEnrico Granata     if (entry.IsSummaryCached())
1095548cb50SEnrico Granata     {
1105548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1115548cb50SEnrico Granata         m_cache_hits++;
1125548cb50SEnrico Granata #endif
1135548cb50SEnrico Granata         summary_sp = entry.GetSummary();
1145548cb50SEnrico Granata         return true;
1155548cb50SEnrico Granata     }
1165548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1175548cb50SEnrico Granata     m_cache_misses++;
1185548cb50SEnrico Granata #endif
1195548cb50SEnrico Granata     summary_sp.reset();
1205548cb50SEnrico Granata     return false;
1215548cb50SEnrico Granata }
1225548cb50SEnrico Granata 
1235548cb50SEnrico Granata bool
1245548cb50SEnrico Granata FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
1255548cb50SEnrico Granata {
1265548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1275548cb50SEnrico Granata     auto entry = GetEntry(type);
1285548cb50SEnrico Granata     if (entry.IsSyntheticCached())
1295548cb50SEnrico Granata     {
1305548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1315548cb50SEnrico Granata         m_cache_hits++;
1325548cb50SEnrico Granata #endif
1335548cb50SEnrico Granata         synthetic_sp = entry.GetSynthetic();
1345548cb50SEnrico Granata         return true;
1355548cb50SEnrico Granata     }
1365548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1375548cb50SEnrico Granata     m_cache_misses++;
1385548cb50SEnrico Granata #endif
1395548cb50SEnrico Granata     synthetic_sp.reset();
1405548cb50SEnrico Granata     return false;
1415548cb50SEnrico Granata }
1425548cb50SEnrico Granata 
1435548cb50SEnrico Granata void
1445548cb50SEnrico Granata FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
1455548cb50SEnrico Granata {
1465548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1475548cb50SEnrico Granata     GetEntry(type).SetSummary(summary_sp);
1485548cb50SEnrico Granata }
1495548cb50SEnrico Granata 
1505548cb50SEnrico Granata void
1515548cb50SEnrico Granata FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
1525548cb50SEnrico Granata {
1535548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1545548cb50SEnrico Granata     GetEntry(type).SetSynthetic(synthetic_sp);
1555548cb50SEnrico Granata }
1565548cb50SEnrico Granata 
1575548cb50SEnrico Granata void
1585548cb50SEnrico Granata FormatCache::Clear ()
1595548cb50SEnrico Granata {
1605548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1615548cb50SEnrico Granata     m_map.clear();
1625548cb50SEnrico Granata }
1635548cb50SEnrico Granata 
164