114 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9 10 11 12#include "lldb/DataFormatters/FormatCache.h"13 14using namespace lldb;15using namespace lldb_private;16 17FormatCache::Entry::Entry()18 : m_format_cached(false), m_summary_cached(false),19 m_synthetic_cached(false) {}20 21bool FormatCache::Entry::IsFormatCached() { return m_format_cached; }22 23bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; }24 25bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; }26 27void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) {28 retval = m_format_sp;29}30 31void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) {32 retval = m_summary_sp;33}34 35void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) {36 retval = m_synthetic_sp;37}38 39void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) {40 m_format_cached = true;41 m_format_sp = format_sp;42}43 44void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) {45 m_summary_cached = true;46 m_summary_sp = summary_sp;47}48 49void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) {50 m_synthetic_cached = true;51 m_synthetic_sp = synthetic_sp;52}53 54namespace lldb_private {55 56template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() {57 return IsFormatCached();58}59template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () {60 return IsSummaryCached();61}62template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() {63 return IsSyntheticCached();64}65 66} // namespace lldb_private67 68template <typename ImplSP>69bool 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/// \{84template bool85FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &);86template bool87FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString,88 lldb::TypeSummaryImplSP &);89template bool90FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString,91 lldb::SyntheticChildrenSP &);92/// \}93 94void 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 99void 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 104void 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 110void FormatCache::Clear() {111 std::lock_guard<std::recursive_mutex> guard(m_mutex);112 m_entries.clear();113}114