From c910aa5a42fb789225bb58c990d077d39da9b4ce Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Wed, 31 Aug 2016 17:21:53 -0400 Subject: Cache lines on API side to avoid UI hangs with large basic blocks --- functiongraph.cpp | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'functiongraph.cpp') diff --git a/functiongraph.cpp b/functiongraph.cpp index 93f60f63..30e2e165 100644 --- a/functiongraph.cpp +++ b/functiongraph.cpp @@ -104,14 +104,26 @@ void FunctionGraph::Abort() } -vector> FunctionGraph::GetBlocks() const +vector> FunctionGraph::GetBlocks() { size_t count; BNFunctionGraphBlock** blocks = BNGetFunctionGraphBlocks(m_graph, &count); vector> result; for (size_t i = 0; i < count; i++) - result.push_back(new FunctionGraphBlock(BNNewFunctionGraphBlockReference(blocks[i]))); + { + auto block = m_cachedBlocks.find(blocks[i]); + if (block == m_cachedBlocks.end()) + { + FunctionGraphBlock* newBlock = new FunctionGraphBlock(BNNewFunctionGraphBlockReference(blocks[i])); + m_cachedBlocks[blocks[i]] = newBlock; + result.push_back(newBlock); + } + else + { + result.push_back(block->second); + } + } BNFreeFunctionGraphBlockList(blocks, count); return result; @@ -137,7 +149,19 @@ vector> FunctionGraph::GetBlocksInRegion(int left, int t vector> result; for (size_t i = 0; i < count; i++) - result.push_back(new FunctionGraphBlock(BNNewFunctionGraphBlockReference(blocks[i]))); + { + auto block = m_cachedBlocks.find(blocks[i]); + if (block == m_cachedBlocks.end()) + { + FunctionGraphBlock* newBlock = new FunctionGraphBlock(BNNewFunctionGraphBlockReference(blocks[i])); + m_cachedBlocks[blocks[i]] = newBlock; + result.push_back(newBlock); + } + else + { + result.push_back(block->second); + } + } BNFreeFunctionGraphBlockList(blocks, count); return result; -- cgit v1.3.1