|
9 | 9 | #include "barretenberg/world_state/tree_with_store.hpp"
|
10 | 10 | #include "barretenberg/world_state/types.hpp"
|
11 | 11 | #include <memory>
|
| 12 | +#include <mutex> |
12 | 13 | #include <stdexcept>
|
13 | 14 | #include <tuple>
|
14 | 15 | #include <unordered_map>
|
@@ -96,18 +97,19 @@ StateReference WorldState::get_state_reference(WorldStateRevision revision) cons
|
96 | 97 | {
|
97 | 98 | Signal signal(static_cast<uint32_t>(_trees.size()));
|
98 | 99 | StateReference state_reference;
|
| 100 | + // multiple threads want to write to state_reference |
| 101 | + std::mutex state_ref_mutex; |
| 102 | + |
99 | 103 | bool uncommitted = include_uncommitted(revision);
|
100 | 104 |
|
101 | 105 | for (const auto& [id, tree] : _trees) {
|
102 |
| - std::visit( |
103 |
| - [&signal, &state_reference, id, uncommitted](auto&& wrapper) { |
104 |
| - auto callback = [&signal, &state_reference, id](const TypedResponse<TreeMetaResponse>& meta) { |
105 |
| - state_reference.insert({ id, { meta.inner.root, meta.inner.size } }); |
106 |
| - signal.signal_decrement(); |
107 |
| - }; |
108 |
| - wrapper.tree->get_meta_data(uncommitted, callback); |
109 |
| - }, |
110 |
| - tree); |
| 106 | + auto callback = [&signal, &state_reference, &state_ref_mutex, id](const TypedResponse<TreeMetaResponse>& meta) { |
| 107 | + std::lock_guard<std::mutex> lock(state_ref_mutex); |
| 108 | + state_reference.insert({ id, { meta.inner.root, meta.inner.size } }); |
| 109 | + signal.signal_decrement(); |
| 110 | + }; |
| 111 | + std::visit([&callback, uncommitted](auto&& wrapper) { wrapper.tree->get_meta_data(uncommitted, callback); }, |
| 112 | + tree); |
111 | 113 | }
|
112 | 114 |
|
113 | 115 | signal.wait_for_level(0);
|
|
0 commit comments