BMF源码分析(四)

文章详细描述了在IT系统中,如何通过Graph初始化和流关系确认来管理OutputStream和InputStream之间的交互,特别是通过add_all_mirrors_for_output_stream函数创建镜像流,以及InputStreamManager填充和传播Packet的过程。
摘要由CSDN通过智能技术生成

在这里插入图片描述
源码如下:
Graph初始化时根据inputstream的identifier_和outputstream的identifier_确认流关系:

// create connections
for (auto &node_iter : nodes_) {
std::map<int, std::shared_ptr> output_streams;
node_iter.second->get_output_streams(output_streams);
// find all downstream connections for every output stream
for (auto &output_stream : output_streams) {
add_all_mirrors_for_output_stream(output_stream.second);
}
}

当两个node之间node1的output_stream的identifier_和node2的input_steams的identifier_相同时确认镜像流关系

int Graph::add_all_mirrors_for_output_stream(
    std::shared_ptr<OutputStream> &output_stream) {
    // go through all the nodes, find the input stream that
    // connected with graph input stream, add it to mirrors
    for (auto &node_iter : nodes_) {
        if (not node_iter.second->is_source()) {
            std::shared_ptr<InputStreamManager> input_stream_manager;
            node_iter.second->get_input_stream_manager(input_stream_manager);
            for (auto &input_stream : input_stream_manager->input_streams_) {
                if (output_stream->identifier_ ==
                    input_stream.second->identifier_) {
                    output_stream->add_mirror_stream(input_stream_manager,
                                                     input_stream.first);
                    input_stream.second->set_connected(true);
                }
            }
        }
    }
    return 0;
}

镜像流源码如下:

MirrorStream::MirrorStream(
    std::shared_ptr<InputStreamManager> input_stream_manager, int stream_id)
    : input_stream_manager_(input_stream_manager), stream_id_(stream_id) {}

OutputStream::OutputStream(int stream_id, std::string const &identifier,
                           std::string const &alias, std::string const &notify)
    : stream_id_(stream_id), identifier_(identifier), alias_(alias),
      notify_(notify) {}

int OutputStream::add_mirror_stream(
    std::shared_ptr<InputStreamManager> input_stream_manager, int stream_id) {
    mirror_streams_.emplace_back(MirrorStream(input_stream_manager, stream_id));
    return 0;
}

InputStreamManager往task中填写packet报文:

bool ImmediateInputStreamManager::fill_task_input(Task &task) {
    bool task_filled = false;
    for (auto &input_stream : input_streams_) {
        if (input_stream.second->is_empty()) {
            //            task.fill_input_packet(iter->second->get_id(),
            //            Packet());
            continue;
        }

        while (not input_stream.second->is_empty()) {
            Packet pkt = input_stream.second->pop_next_packet(false);
            if (pkt.timestamp() == BMF_EOF) {
                if (input_stream.second->probed_) {
                    BMFLOG(BMF_INFO)
                        << "immediate sync got EOF from dynamical update";
                    pkt.set_timestamp(DYN_EOS);
                    input_stream.second->probed_ = false;
                } else
                    stream_done_[input_stream.first] = 1;
            }
            task.fill_input_packet(input_stream.second->get_id(), pkt);
            task_filled = true;
        }
    }

    if (stream_done_.size() == input_streams_.size()) {
        task.set_timestamp(BMF_EOF);
    }
    return task_filled;
}

OutputStreamManager将task放入下一个node节点的inputstream中

int OutputStreamManager::post_process(Task &task) {
    for (auto &t : task.outputs_queue_) {
        auto q = std::make_shared<SafeQueue<Packet>>(t.second);
        output_streams_[t.first]->propagate_packets(q);
    }
    return 0;
}

int OutputStream::propagate_packets(
    std::shared_ptr<SafeQueue<Packet>> packets) {
    for (auto &s : mirror_streams_) {
        auto copy_queue = std::make_shared<SafeQueue<Packet>>(*packets.get());
        copy_queue->set_identifier(identifier_);
        s.input_stream_manager_->add_packets(s.stream_id_, copy_queue);
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值