| 104 | namespace { |
| 105 | |
| 106 | std::shared_ptr<KernelCache::ViewSpecificState> ViewSpecificStateForId( |
| 107 | uint64_t viewIdentifier, bool insertIfNeeded = true) |
| 108 | { |
| 109 | static std::mutex viewSpecificStateMutex; |
| 110 | static std::unordered_map<uint64_t, std::weak_ptr<KernelCache::ViewSpecificState>> viewSpecificState; |
| 111 | |
| 112 | std::lock_guard lock(viewSpecificStateMutex); |
| 113 | |
| 114 | if (auto it = viewSpecificState.find(viewIdentifier); it != viewSpecificState.end()) |
| 115 | { |
| 116 | if (auto statePtr = it->second.lock()) |
| 117 | return statePtr; |
| 118 | } |
| 119 | |
| 120 | if (!insertIfNeeded) |
| 121 | return nullptr; |
| 122 | |
| 123 | auto statePtr = std::make_shared<KernelCache::ViewSpecificState>(); |
| 124 | viewSpecificState[viewIdentifier] = statePtr; |
| 125 | |
| 126 | // Prune entries for any views that are no longer in use. |
| 127 | for (auto it = viewSpecificState.begin(); it != viewSpecificState.end();) |
| 128 | { |
| 129 | if (it->second.expired()) |
| 130 | it = viewSpecificState.erase(it); |
| 131 | else |
| 132 | ++it; |
| 133 | } |
| 134 | |
| 135 | return statePtr; |
| 136 | } |
| 137 | |
| 138 | std::shared_ptr<KernelCache::ViewSpecificState> ViewSpecificStateForView(Ref<BinaryNinja::BinaryView> view) |
| 139 | { |
no test coverage detected