1 //===-- FormatCache.cpp ---------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 10 11 12 #include "lldb/DataFormatters/FormatCache.h" 13 14 using namespace lldb; 15 using namespace lldb_private; 16 17 FormatCache::Entry::Entry() 18 : m_format_cached(false), m_summary_cached(false), 19 m_synthetic_cached(false) {} 20 21 bool FormatCache::Entry::IsFormatCached() { return m_format_cached; } 22 23 bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; } 24 25 bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; } 26 27 void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) { 28 retval = m_format_sp; 29 } 30 31 void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) { 32 retval = m_summary_sp; 33 } 34 35 void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) { 36 retval = m_synthetic_sp; 37 } 38 39 void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) { 40 m_format_cached = true; 41 m_format_sp = format_sp; 42 } 43 44 void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) { 45 m_summary_cached = true; 46 m_summary_sp = summary_sp; 47 } 48 49 void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) { 50 m_synthetic_cached = true; 51 m_synthetic_sp = synthetic_sp; 52 } 53 54 FormatCache::Entry &FormatCache::GetEntry(ConstString type) { 55 auto i = m_map.find(type), e = m_map.end(); 56 if (i != e) 57 return i->second; 58 m_map[type] = FormatCache::Entry(); 59 return m_map[type]; 60 } 61 62 namespace lldb_private { 63 64 template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() { 65 return IsFormatCached(); 66 } 67 template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () { 68 return IsSummaryCached(); 69 } 70 template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() { 71 return IsSyntheticCached(); 72 } 73 74 } // namespace lldb_private 75 76 template <typename ImplSP> 77 bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) { 78 std::lock_guard<std::recursive_mutex> guard(m_mutex); 79 auto entry = GetEntry(type); 80 if (entry.IsCached<ImplSP>()) { 81 m_cache_hits++; 82 entry.Get(format_impl_sp); 83 return true; 84 } 85 m_cache_misses++; 86 format_impl_sp.reset(); 87 return false; 88 } 89 90 /// Explicit instantiations for the three types. 91 /// \{ 92 template bool 93 FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &); 94 template bool 95 FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString, 96 lldb::TypeSummaryImplSP &); 97 template bool 98 FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString, 99 lldb::SyntheticChildrenSP &); 100 /// \} 101 102 void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) { 103 std::lock_guard<std::recursive_mutex> guard(m_mutex); 104 GetEntry(type).Set(format_sp); 105 } 106 107 void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) { 108 std::lock_guard<std::recursive_mutex> guard(m_mutex); 109 GetEntry(type).Set(summary_sp); 110 } 111 112 void FormatCache::Set(ConstString type, 113 lldb::SyntheticChildrenSP &synthetic_sp) { 114 std::lock_guard<std::recursive_mutex> guard(m_mutex); 115 GetEntry(type).Set(synthetic_sp); 116 } 117 118 void FormatCache::Clear() { 119 std::lock_guard<std::recursive_mutex> guard(m_mutex); 120 m_map.clear(); 121 } 122