56 using pre_order_iterator =
typename graph_t::pre_order_iterator;
57 using sibling_iterator =
typename graph_t::sibling_iterator;
64 auto_lock_t l(singleton_t::get_mutex(), std::defer_lock);
69 if(!rhs.is_initialized())
74 PRINT_HERE(
"[%s]> nullptr to settings!", Type::get_label().c_str());
80 auto _copy_hash_ids = [&lhs, &rhs, _debug]() {
82 if(rhs.get_hash_ids() && lhs.get_hash_ids())
84 auto_lock_t _lk{ type_mutex<hash_map_t>(), std::defer_lock };
89 _debug,
"[%s]> merging %lu hash-ids into existing set of %lu hash-ids!",
90 Type::get_label().c_str(), (
unsigned long) rhs.get_hash_ids()->size(),
91 (
unsigned long) lhs.get_hash_ids()->size());
93 auto _hash_ids = *rhs.get_hash_ids();
94 for(
const auto& itr : _hash_ids)
96 if(lhs.m_hash_ids->find(itr.first) == lhs.m_hash_ids->end())
97 lhs.m_hash_ids->emplace(itr.first, itr.second);
101 if(rhs.get_hash_aliases() && lhs.get_hash_aliases())
103 auto_lock_t _lk{ type_mutex<hash_alias_map_t>(), std::defer_lock };
108 "[%s]> merging %lu hash-aliases into existing set of "
110 Type::get_label().c_str(),
111 (
unsigned long) rhs.get_hash_aliases()->size(),
112 (
unsigned long) lhs.get_hash_aliases()->size());
114 auto _hash_aliases = *rhs.get_hash_aliases();
115 for(
const auto& itr : _hash_aliases)
117 if(lhs.m_hash_aliases->find(itr.first) == lhs.m_hash_aliases->end())
118 lhs.m_hash_aliases->emplace(itr.first, itr.second);
124 if(rhs.is_initialized() && !lhs.is_initialized())
126 PRINT_HERE(
"[%s]> Warning! master is not initialized! Segmentation fault likely",
127 Type::get_label().c_str());
128 lhs.graph().insert_subgraph_after(lhs._data().head(), rhs.data().head());
129 lhs.graph().steal_resources(rhs.graph());
130 lhs.m_initialized = rhs.m_initialized;
131 lhs.m_finalized = rhs.m_finalized;
138 if(rhs.empty() || !rhs.data().has_head())
141 int64_t num_merged = 0;
142 auto inverse_insert = rhs.data().get_inverse_insert();
144 for(
auto entry : inverse_insert)
146 auto master_entry = lhs.data().find(
entry.second);
147 if(master_entry != lhs.data().end())
149 pre_order_iterator pitr(
entry.second);
151 if(rhs.graph().is_valid(pitr) && pitr)
154 _debug,
"[%s]> worker is merging %i records into %i records",
155 Type::get_label().c_str(), (
int) rhs.size(), (
int) lhs.size());
157 pre_order_iterator
pos = master_entry;
162 sibling_iterator other = pitr;
163 for(
auto sitr = other.begin(); sitr != other.end(); ++sitr)
165 pre_order_iterator pchild = sitr;
166 if(!pchild || pchild->data().get_is_invalid())
168 lhs.graph().append_child(
pos, pchild);
173 Type::get_label().c_str(), (
int) lhs.size());
181 int64_t merge_size =
static_cast<int64_t
>(inverse_insert.size());
182 if(num_merged != merge_size)
184 int64_t diff = merge_size - num_merged;
185 std::stringstream ss;
186 ss <<
"Testing error! Missing " << diff <<
" merge points. The worker thread "
187 <<
"contained " << merge_size <<
" bookmarks but only merged " << num_merged
192#if defined(TIMEMORY_TESTING) || defined(TIMEMORY_INTERNAL_TESTING)
200 Type::get_label().c_str());
201 pre_order_iterator _nitr(rhs.data().head());
203 if(!lhs.graph().is_valid(_nitr))
204 _nitr = pre_order_iterator(rhs.data().head());
205 lhs.graph().append_child(lhs._data().head(), _nitr);
209 Type::get_label().c_str());
211 lhs.graph().steal_resources(rhs.graph());
std::unique_lock< mutex_t > auto_lock_t
Unique lock type around mutex_t.
char argparse::argument_parser tim::settings * _settings
static settings * instance()
#define CONDITIONAL_PRINT_HERE(CONDITION,...)
#define TIMEMORY_EXCEPTION(...)