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 namespace lldb_private { 55 56 template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() { 57 return IsFormatCached(); 58 } 59 template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () { 60 return IsSummaryCached(); 61 } 62 template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() { 63 return IsSyntheticCached(); 64 } 65 66 } // namespace lldb_private 67 68 template <typename ImplSP> 69 bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) { 70 std::lock_guard<std::recursive_mutex> guard(m_mutex); 71 auto entry = m_entries[type]; 72 if (entry.IsCached<ImplSP>()) { 73 m_cache_hits++; 74 entry.Get(format_impl_sp); 75 return true; 76 } 77 m_cache_misses++; 78 format_impl_sp.reset(); 79 return false; 80 } 81 82 /// Explicit instantiations for the three types. 83 /// \{ 84 template bool 85 FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &); 86 template bool 87 FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString, 88 lldb::TypeSummaryImplSP &); 89 template bool 90 FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString, 91 lldb::SyntheticChildrenSP &); 92 /// \} 93 94 void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) { 95 std::lock_guard<std::recursive_mutex> guard(m_mutex); 96 m_entries[type].Set(format_sp); 97 } 98 99 void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) { 100 std::lock_guard<std::recursive_mutex> guard(m_mutex); 101 m_entries[type].Set(summary_sp); 102 } 103 104 void FormatCache::Set(ConstString type, 105 lldb::SyntheticChildrenSP &synthetic_sp) { 106 std::lock_guard<std::recursive_mutex> guard(m_mutex); 107 m_entries[type].Set(synthetic_sp); 108 } 109 110 void FormatCache::Clear() { 111 std::lock_guard<std::recursive_mutex> guard(m_mutex); 112 m_entries.clear(); 113 } 114