summaryrefslogtreecommitdiff
path: root/functiongraph.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-08-31 17:21:53 -0400
committerRusty Wagner <rusty@vector35.com>2016-08-31 17:22:29 -0400
commitc910aa5a42fb789225bb58c990d077d39da9b4ce (patch)
tree45222fe184d2f0a64b4801fde05b72454cf3aa05 /functiongraph.cpp
parent548b906badf83e500551522a87242fefbc582d2c (diff)
Cache lines on API side to avoid UI hangs with large basic blocks
Diffstat (limited to 'functiongraph.cpp')
-rw-r--r--functiongraph.cpp30
1 files changed, 27 insertions, 3 deletions
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<Ref<FunctionGraphBlock>> FunctionGraph::GetBlocks() const
+vector<Ref<FunctionGraphBlock>> FunctionGraph::GetBlocks()
{
size_t count;
BNFunctionGraphBlock** blocks = BNGetFunctionGraphBlocks(m_graph, &count);
vector<Ref<FunctionGraphBlock>> 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<Ref<FunctionGraphBlock>> FunctionGraph::GetBlocksInRegion(int left, int t
vector<Ref<FunctionGraphBlock>> 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;