42 {
43 std::lock_guard<std::mutex> lock(m_mutex);
44 if (m_fragments.empty()) return false;
45
46
47 Timestamp window_ref_time = m_event_reference_time;
48
49 auto it_begin = m_fragments.lower_bound(window_ref_time - coherence_window_ns);
50 auto it_end = m_fragments.upper_bound(window_ref_time + coherence_window_ns);
51
52 if (it_begin == it_end) return false;
53
54 std::set<uint64_t> subsystems_found;
55 std::vector<Timestamp> timestamps_in_window;
56
57 for (auto it = it_begin; it != it_end; ++it) {
58 timestamps_in_window.push_back(it->first);
59 for (const auto& frag : it->second) {
60 subsystems_found.insert(frag.header.subsystem_id);
61 }
62 }
63
64
65
66 if (subsystems_found.size() < static_cast<size_t>(min_subsystems)) {
67 return false;
68 }
69
70
71 for (Timestamp ts : timestamps_in_window) {
72 for (auto& frag : m_fragments[ts]) {
73 built_fragments.push_back(std::move(frag));
74 }
75 m_fragments.erase(ts);
76 }
77
78
79 if (!m_fragments.empty()) {
80 m_event_reference_time = m_fragments.begin()->first;
81 }
82
83 return true;
84 }