#pragma once // 定义管道引擎 包含队列、运行状态、工作线程、计数器、插件管理器 #include #include #include #include #include #include #include #include #include "core/plugin_system/PluginManager.h" #include "core/plugin_system/IProtocolFramerPlugin.h" #include "core/plugin_system/IProtocolMapperPlugin.h" #include "core/models/DOMMessage.h" #include "core/models/EnrichedMessage.h" #include "core/models/RawBusMessage.h" #include "core/memory/LockFreeQueue.h" #include "core/memory/MemoryPool.h" #include "core/threading/MutexQueue.h" #include "message_bus/pipeline/DynamicRuleRegistry.h" #include "message_bus/pipeline/stages/1_framers/PassthroughFramer.h" namespace softbus::message_bus::pipeline { struct PipelineRuntimeConfig { bool parallelPipeline{false}; int parseWorkerCount{2}; bool orderedEgress{true}; std::size_t framedQueueMax{4096}; std::size_t maxReorderDepth{256}; }; struct EndpointFramingState; class PipelineEngine { public: struct Counters { std::atomic in{0}; std::atomic out{0}; std::atomic drop{0}; std::atomic error{0}; std::atomic mergeDrop{0}; }; explicit PipelineEngine(std::size_t queueCapacity = 4096); ~PipelineEngine(); void start(); void stop(); void drain(); bool enqueueIngress(softbus::core::models::RawBusMessage ctx); bool enqueueEgress(softbus::core::models::RawBusMessage ctx); bool tryPopEgress(softbus::core::models::RawBusMessage& out); void setPluginManager(std::shared_ptr pluginManager); void setMemoryPool(std::shared_ptr pool); void setRuntimeConfig(PipelineRuntimeConfig cfg); void loadRuntimeConfigFromJson(const QJsonObject& obj); const Counters& counters() const { return m_counters; } private: struct MergeItem { QString endpoint; std::uint64_t seq{0}; softbus::core::models::RawBusMessage ctx; bool pipelineOk{false}; }; struct MergeState { std::uint64_t nextExpected{1}; QHash> buffer; }; void runSingleWorker(); void parseWorkerLoop(); void mergerLoop(); void ensureEndpointFramer(const QString& endpoint); void dispatchFramer(softbus::core::models::RawBusMessage& chunkIn, std::vector& completeFramesOut); std::uint64_t assignFrameSequence(const QString& endpoint); bool runStages234(const softbus::core::models::RawBusMessage& ctx); void ingestMergeItem(MergeItem item); std::vector stage2Parser(const softbus::core::models::RawBusMessage& ctx); bool stage3Filter(softbus::core::models::DOMMessage& message); bool stage4Validator(const softbus::core::models::DOMMessage& message) const; softbus::core::models::EnrichedMessage applyTransformAndEnrich( const softbus::core::models::RawBusMessage& rawCtx, softbus::core::models::DOMMessage& message) const; 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; std::shared_ptr m_pool; PipelineRuntimeConfig m_rtConfig; std::shared_ptr m_passthroughFramer; std::mutex m_framerSessionMutex; QHash> m_framerSessions; std::mutex m_parserSessionMutex; QHash> m_parserSessions; std::mutex m_mapperSessionMutex; QHash> m_mapperSessions; std::mutex m_seqMutex; QHash m_nextFrameSeqByEndpoint; std::unique_ptr> m_framedQ; std::unique_ptr> m_mergeQ; std::vector m_parseThreads; std::thread m_mergerThread; std::mutex m_endpointMutex; QHash> m_endpointFramers; std::mutex m_mergeStateMutex; QHash m_mergeByEndpoint; int m_count{0}; // 计数器 }; } // namespace softbus::message_bus::pipeline