From a6ac2bf1a15ca82cff69ac6a16503883da3f9e30 Mon Sep 17 00:00:00 2001 From: Johanness Date: Sun, 14 Jun 2026 16:54:37 +0300 Subject: [PATCH] fabric-bridge: thread-safe startup, detailed Fabrics API logging --- .../fabric-bridge/src/fabric_bridge_node.cpp | 23 +++++++++++++------ .../fabric-bridge/src/fabric_bridge_node.hpp | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/nodes/fabric-bridge/src/fabric_bridge_node.cpp b/nodes/fabric-bridge/src/fabric_bridge_node.cpp index 3a2c815..ebb6fb5 100644 --- a/nodes/fabric-bridge/src/fabric_bridge_node.cpp +++ b/nodes/fabric-bridge/src/fabric_bridge_node.cpp @@ -44,20 +44,30 @@ void FabricBridgeNode::configure(const nlohmann::json& params) { if (params.contains("target_info")) { target_info_str_ = params["target_info"].get(); + if (mode_ == FabricMode::Initiator && reader_.has_value() && !target_info_str_.empty()) { + start_requested_.store(true); + spdlog::info("Fabric-bridge: target_info set, signaling startup"); + } } } void FabricBridgeNode::on_add_writer(const std::string& port_id, mxlFlowWriter writer) { if (port_id == "video_out") { writer_ = writer; - spdlog::info("Fabric-bridge: writer added (target mode)"); + start_requested_.store(true); + spdlog::info("Fabric-bridge: writer added (target mode), signaling startup"); } } void FabricBridgeNode::on_add_reader(const std::string& port_id, mxlFlowReader reader) { if (port_id == "video_in") { reader_ = reader; - spdlog::info("Fabric-bridge: reader added (initiator mode)"); + if (mode_ == FabricMode::Initiator && !target_info_str_.empty()) { + start_requested_.store(true); + spdlog::info("Fabric-bridge: reader added (initiator mode), signaling startup"); + } else { + spdlog::info("Fabric-bridge: reader added (initiator mode), waiting for target_info"); + } } } @@ -76,12 +86,11 @@ void FabricBridgeNode::on_remove_reader(const std::string& port_id) { } void FabricBridgeNode::process() { - if (!worker_thread_.has_value()) { - if (mode_ == FabricMode::Initiator && reader_.has_value() && !target_info_str_.empty()) { - running_ = true; + if (!worker_thread_.has_value() && start_requested_.load()) { + running_ = true; + if (mode_ == FabricMode::Initiator) { worker_thread_ = std::thread(&FabricBridgeNode::run_initiator, this); - } else if (mode_ == FabricMode::Target && writer_.has_value()) { - running_ = true; + } else { worker_thread_ = std::thread(&FabricBridgeNode::run_target, this); } } diff --git a/nodes/fabric-bridge/src/fabric_bridge_node.hpp b/nodes/fabric-bridge/src/fabric_bridge_node.hpp index 3a39a06..ed52c58 100644 --- a/nodes/fabric-bridge/src/fabric_bridge_node.hpp +++ b/nodes/fabric-bridge/src/fabric_bridge_node.hpp @@ -57,6 +57,7 @@ private: std::optional worker_thread_; std::atomic running_{false}; + std::atomic start_requested_{false}; }; } // namespace dmf_node \ No newline at end of file