txgraph: Allow Refs to outlive the TxGraph (feature)

This commit is contained in:
Pieter Wuille
2025-03-21 15:17:42 -04:00
parent 82fa3573e1
commit 22c68cd153
3 changed files with 22 additions and 1 deletions

View File

@@ -320,6 +320,9 @@ public:
Assume(max_cluster_count <= MAX_CLUSTER_COUNT_LIMIT);
}
/** Destructor. */
~TxGraphImpl() noexcept;
// Cannot move or copy (would invalidate TxGraphImpl* in Ref, MiningOrder, EvictionOrder).
TxGraphImpl(const TxGraphImpl&) = delete;
TxGraphImpl& operator=(const TxGraphImpl&) = delete;
@@ -809,6 +812,17 @@ void Cluster::ApplyDependencies(TxGraphImpl& graph, std::span<std::pair<GraphInd
Updated(graph);
}
TxGraphImpl::~TxGraphImpl() noexcept
{
// If Refs outlive the TxGraphImpl they refer to, unlink them, so that their destructor does not
// try to reach into a non-existing TxGraphImpl anymore.
for (auto& entry : m_entries) {
if (entry.m_ref != nullptr) {
GetRefGraph(*entry.m_ref) = nullptr;
}
}
}
std::unique_ptr<Cluster> TxGraphImpl::ExtractCluster(int level, QualityLevel quality, ClusterSetIndex setindex) noexcept
{
Assume(quality != QualityLevel::NONE);