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 
10*676a4875SMatt Kopec #include "lldb/lldb-python.h"
11*676a4875SMatt Kopec 
125548cb50SEnrico Granata // C Includes
135548cb50SEnrico Granata 
145548cb50SEnrico Granata // C++ Includes
155548cb50SEnrico Granata 
165548cb50SEnrico Granata // Other libraries and framework includes
175548cb50SEnrico Granata 
185548cb50SEnrico Granata // Project includes
195548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h"
205548cb50SEnrico Granata 
215548cb50SEnrico Granata using namespace lldb;
225548cb50SEnrico Granata using namespace lldb_private;
235548cb50SEnrico Granata 
245548cb50SEnrico Granata FormatCache::Entry::Entry () :
255548cb50SEnrico Granata m_summary_cached(false),
265548cb50SEnrico Granata m_synthetic_cached(false),
2730b95a36SDaniel Malea m_summary_sp(),
2830b95a36SDaniel Malea m_synthetic_sp()
295548cb50SEnrico Granata {}
305548cb50SEnrico Granata 
310b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
320b464d48SDaniel Malea m_synthetic_cached(false),
330b464d48SDaniel Malea m_synthetic_sp()
345548cb50SEnrico Granata {
355548cb50SEnrico Granata     SetSummary (summary_sp);
365548cb50SEnrico Granata }
375548cb50SEnrico Granata 
380b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
390b464d48SDaniel Malea m_summary_cached(false),
400b464d48SDaniel Malea m_summary_sp()
415548cb50SEnrico Granata {
425548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
435548cb50SEnrico Granata }
445548cb50SEnrico Granata 
450b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp)
465548cb50SEnrico Granata {
475548cb50SEnrico Granata     SetSummary (summary_sp);
485548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
495548cb50SEnrico Granata }
505548cb50SEnrico Granata 
515548cb50SEnrico Granata bool
525548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached ()
535548cb50SEnrico Granata {
545548cb50SEnrico Granata     return m_summary_cached;
555548cb50SEnrico Granata }
565548cb50SEnrico Granata 
575548cb50SEnrico Granata bool
585548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached ()
595548cb50SEnrico Granata {
605548cb50SEnrico Granata     return m_synthetic_cached;
615548cb50SEnrico Granata }
625548cb50SEnrico Granata 
635548cb50SEnrico Granata lldb::TypeSummaryImplSP
645548cb50SEnrico Granata FormatCache::Entry::GetSummary ()
655548cb50SEnrico Granata {
665548cb50SEnrico Granata     return m_summary_sp;
675548cb50SEnrico Granata }
685548cb50SEnrico Granata 
695548cb50SEnrico Granata lldb::SyntheticChildrenSP
705548cb50SEnrico Granata FormatCache::Entry::GetSynthetic ()
715548cb50SEnrico Granata {
725548cb50SEnrico Granata     return m_synthetic_sp;
735548cb50SEnrico Granata }
745548cb50SEnrico Granata 
755548cb50SEnrico Granata void
765548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
775548cb50SEnrico Granata {
785548cb50SEnrico Granata     m_summary_cached = true;
795548cb50SEnrico Granata     m_summary_sp = summary_sp;
805548cb50SEnrico Granata }
815548cb50SEnrico Granata 
825548cb50SEnrico Granata void
835548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
845548cb50SEnrico Granata {
855548cb50SEnrico Granata     m_synthetic_cached = true;
865548cb50SEnrico Granata     m_synthetic_sp = synthetic_sp;
875548cb50SEnrico Granata }
885548cb50SEnrico Granata 
895548cb50SEnrico Granata FormatCache::FormatCache () :
905548cb50SEnrico Granata m_map(),
915548cb50SEnrico Granata m_mutex (Mutex::eMutexTypeRecursive)
925548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
935548cb50SEnrico Granata ,m_cache_hits(0),m_cache_misses(0)
945548cb50SEnrico Granata #endif
955548cb50SEnrico Granata {
965548cb50SEnrico Granata }
975548cb50SEnrico Granata 
985548cb50SEnrico Granata FormatCache::Entry&
995548cb50SEnrico Granata FormatCache::GetEntry (const ConstString& type)
1005548cb50SEnrico Granata {
1015548cb50SEnrico Granata     auto i = m_map.find(type),
1025548cb50SEnrico Granata     e = m_map.end();
1035548cb50SEnrico Granata     if (i != e)
1045548cb50SEnrico Granata         return i->second;
1055548cb50SEnrico Granata     m_map[type] = FormatCache::Entry();
1065548cb50SEnrico Granata     return m_map[type];
1075548cb50SEnrico Granata }
1085548cb50SEnrico Granata 
1095548cb50SEnrico Granata bool
1105548cb50SEnrico Granata FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
1115548cb50SEnrico Granata {
1125548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1135548cb50SEnrico Granata     auto entry = GetEntry(type);
1145548cb50SEnrico Granata     if (entry.IsSummaryCached())
1155548cb50SEnrico Granata     {
1165548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1175548cb50SEnrico Granata         m_cache_hits++;
1185548cb50SEnrico Granata #endif
1195548cb50SEnrico Granata         summary_sp = entry.GetSummary();
1205548cb50SEnrico Granata         return true;
1215548cb50SEnrico Granata     }
1225548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1235548cb50SEnrico Granata     m_cache_misses++;
1245548cb50SEnrico Granata #endif
1255548cb50SEnrico Granata     summary_sp.reset();
1265548cb50SEnrico Granata     return false;
1275548cb50SEnrico Granata }
1285548cb50SEnrico Granata 
1295548cb50SEnrico Granata bool
1305548cb50SEnrico Granata FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
1315548cb50SEnrico Granata {
1325548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1335548cb50SEnrico Granata     auto entry = GetEntry(type);
1345548cb50SEnrico Granata     if (entry.IsSyntheticCached())
1355548cb50SEnrico Granata     {
1365548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1375548cb50SEnrico Granata         m_cache_hits++;
1385548cb50SEnrico Granata #endif
1395548cb50SEnrico Granata         synthetic_sp = entry.GetSynthetic();
1405548cb50SEnrico Granata         return true;
1415548cb50SEnrico Granata     }
1425548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1435548cb50SEnrico Granata     m_cache_misses++;
1445548cb50SEnrico Granata #endif
1455548cb50SEnrico Granata     synthetic_sp.reset();
1465548cb50SEnrico Granata     return false;
1475548cb50SEnrico Granata }
1485548cb50SEnrico Granata 
1495548cb50SEnrico Granata void
1505548cb50SEnrico Granata FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
1515548cb50SEnrico Granata {
1525548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1535548cb50SEnrico Granata     GetEntry(type).SetSummary(summary_sp);
1545548cb50SEnrico Granata }
1555548cb50SEnrico Granata 
1565548cb50SEnrico Granata void
1575548cb50SEnrico Granata FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
1585548cb50SEnrico Granata {
1595548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1605548cb50SEnrico Granata     GetEntry(type).SetSynthetic(synthetic_sp);
1615548cb50SEnrico Granata }
1625548cb50SEnrico Granata 
1635548cb50SEnrico Granata void
1645548cb50SEnrico Granata FormatCache::Clear ()
1655548cb50SEnrico Granata {
1665548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1675548cb50SEnrico Granata     m_map.clear();
1685548cb50SEnrico Granata }
1695548cb50SEnrico Granata 
170