#pragma once #include #include #include #include "core/plugin_system/PluginManager.h" #include "core/memory/LockFreeQueue.h" #include "message_bus/pipeline/PipelineContext.h" namespace softbus::message_bus::pipeline { class PipelineEngine { public: struct Counters { std::atomic in{0}; std::atomic out{0}; std::atomic drop{0}; std::atomic error{0}; }; explicit PipelineEngine(std::size_t queueCapacity = 4096); ~PipelineEngine(); void start(); void stop(); void drain(); bool enqueueIngress(PipelineContext ctx); bool enqueueEgress(PipelineContext ctx); bool tryPopEgress(PipelineContext& out); void setPluginManager(std::shared_ptr pluginManager); const Counters& counters() const { return m_counters; } private: void run(); bool stage1Framer(PipelineContext& ctx); bool stage2Parser(PipelineContext& ctx); bool stage3Filter(PipelineContext& ctx); bool stage4Validator(PipelineContext& ctx); private: softbus::core::memory::LockFreeQueue m_ingressQ; softbus::core::memory::LockFreeQueue m_egressQ; std::atomic m_running{false}; std::thread m_worker; Counters m_counters; std::shared_ptr m_pluginManager; }; } // namespace softbus::message_bus::pipeline