27 const std::shared_ptr<DataProcessor>& processor,
28 const std::shared_ptr<SignalSourceContainer>& container,
29 const std::string& tag =
"");
37 void add_processor_at(
38 const std::shared_ptr<DataProcessor>& processor,
39 const std::shared_ptr<SignalSourceContainer>& container,
51 const std::shared_ptr<DataProcessor>& processor,
52 const std::shared_ptr<SignalSourceContainer>& container);
58 void process(
const std::shared_ptr<SignalSourceContainer>& container);
65 void process_filtered(
66 const std::shared_ptr<SignalSourceContainer>& container,
67 const std::function<
bool(
const std::shared_ptr<DataProcessor>&)>& filter);
75 const std::shared_ptr<SignalSourceContainer>& container,
76 const std::string& tag);
83 template <
typename ProcessorType>
84 void process_typed(
const std::shared_ptr<SignalSourceContainer>& container)
86 bool expected =
false;
87 if (!m_is_processing.compare_exchange_strong(expected,
true,
88 std::memory_order_acquire, std::memory_order_relaxed)) {
92 auto it = m_container_processors.find(container);
93 if (it != m_container_processors.end()) {
94 for (
auto& processor : it->second) {
95 if (
auto typed = std::dynamic_pointer_cast<ProcessorType>(processor)) {
96 typed->process(container);
101 m_is_processing.store(
false, std::memory_order_release);
102 drain_pending_removals();
111 void remove_processor_direct(
112 const std::shared_ptr<DataProcessor>& processor,
113 const std::shared_ptr<SignalSourceContainer>& container);
118 void drain_pending_removals();
124 std::shared_ptr<SignalSourceContainer>,
125 std::vector<std::shared_ptr<DataProcessor>>>
139 std::vector<std::pair<std::shared_ptr<DataProcessor>,
140 std::shared_ptr<SignalSourceContainer>>>
150 std::atomic<bool> m_is_processing {
false };
void add_processor(const std::shared_ptr< Buffers::BufferProcessor > &processor, const std::shared_ptr< Buffers::Buffer > &buffer, Buffers::ProcessingToken token)
Adds a processor to a specific buffer.