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