CARLA
 
载入中...
搜索中...
未找到
MultiStreamState.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once
8// 包含必要的头文件
10// 用于原子性的共享指针操作
11#include "carla/Logging.h"
12// 用于日志记录
14// 基类,可能提供了一些基本的流状态管理功能
16
17#include <mutex>
18#include <vector>
19#include <atomic>
20
21namespace carla {
22namespace streaming {
23namespace detail {
24
25 /// A stream state that can hold any number of sessions.
26 ///
27 /// @todo Lacking some optimization.
28 class MultiStreamState final : public StreamStateBase {
29 public:
30 // 调用基类的构造函数
32 // 构造函数,接受一个 token 并初始化成员变量
37// 模板函数,用于写入数据到流中
38 template <typename... Buffers>
39 void Write(Buffers... buffers) {
40 // try write single stream
41 auto session = _session.load();
42 if (session != nullptr) {
43 // 创建消息并写入单个会话
44 auto message = Session::MakeMessage(buffers...);
45 session->Write(std::move(message));
46 log_debug("sensor ", session->get_stream_id()," data sent");
47 // Return here, _session is only valid if we have a
48 // single session.
49 return;
50 }
51
52 // try write multiple stream
53 std::lock_guard<std::mutex> lock(_mutex);
54 if (_sessions.size() > 0) {
55 // 创建消息并写入多个会话
56 auto message = Session::MakeMessage(buffers...);
57 for (auto &s : _sessions) {
58 if (s != nullptr) {
59 s->Write(message);
60 log_debug("sensor ", s->get_stream_id()," data sent ");
61 }
62 }
63 }
64 }
65 // 设置强制激活标志
66 void ForceActive() {
67 _force_active = true;
68 }
69// 启用与 ROS 的交互
70 void EnableForROS() {
71 _enabled_for_ros = true;
72 }
73// 禁用与 ROS 的交互
75 _enabled_for_ros = false;
76 }
77 // 检查是否为 ROS 启用了流状态
79 return _enabled_for_ros;
80 }
81 // 检查是否有客户端正在监听流
83 return (_sessions.size() > 0 || _force_active || _enabled_for_ros);
84 }
85// 连接一个新的会话
86 void ConnectSession(std::shared_ptr<Session> session) final {
87 DEBUG_ASSERT(session != nullptr);
88 std::lock_guard<std::mutex> lock(_mutex);
89 // 将新会话添加到会话列表中
90 _sessions.emplace_back(std::move(session));
91 log_debug("Connecting multistream sessions:", _sessions.size());
92 if (_sessions.size() == 1) {
93 // 如果只有一个会话,设置 _session 指向这个会话
94 _session.store(_sessions[0]);
95 }
96 else if (_sessions.size() > 1) {
97 // 如果有多个会话,设置 _session 为空指针
98 _session.store(nullptr);
99 }
100 }
101// 断开一个会话
102 void DisconnectSession(std::shared_ptr<Session> session) final {
103 DEBUG_ASSERT(session != nullptr);
104 std::lock_guard<std::mutex> lock(_mutex);
105 log_debug("Calling DisconnectSession for ", session->get_stream_id());
106 if (_sessions.size() == 0) return;
107 if (_sessions.size() == 1) {
108 DEBUG_ASSERT(session == _session.load());
109 _session.store(nullptr);
110 _sessions.clear();
111 _force_active = false;
112 log_debug("Last session disconnected");
113 } else {
114 // 从会话列表中移除指定的会话
115 _sessions.erase(
116 std::remove(_sessions.begin(), _sessions.end(), session),
117 _sessions.end());
118
119 // set single session if only one
120 if (_sessions.size() == 1)// 检查当前会话集合的大小
121 _session.store(_sessions[0]); // 如果会话集合中只有一个会话,
122 // 则将该会话存储到某个全局或成员变量 _session 中
123 else
124 _session.store(nullptr);
125 }
126 // 如果会话集合中有多个会话或没有会话,
127 // 则将 nullptr 存储到 _session 中,
128 // 表示当前没有活动的会话或不确定哪个会话是活动的
129 log_debug("Disconnecting multistream sessions:", _sessions.size());
130 }
131 // 使用 log_debug 函数记录一条调试信息,
132 // 显示正在断开连接的多流会话的数量
133 // 清空所有的会话
134 void ClearSessions() final {
135 // ClearSessions 是一个成员函数,用于清除所有会话并重置相关状态
136 std::lock_guard<std::mutex> lock(_mutex);
137 // 使用 std::lock_guard 自动管理互斥锁 _mutex 的锁定和解锁
138 // 这确保了在多线程环境中对 _sessions 的访问是线程安全的
139 for (auto &s : _sessions) {
140 // 遍历 _sessions 容器中的每个会话对象
141 if (s != nullptr) {
142 s->Close();
143 // 如果会话对象不是 nullptr,则调用其 Close 方法来关闭会话
144 }
145 }
146 _sessions.clear();
147 // 清空 _sessions 容器,移除所有会话对象
148 _force_active = false; // 将 _force_active 标志设置为 false,表示没有强制活动的会话
149 _session.store(nullptr);
150 // 将 _session 变量重置为 nullptr,表示当前没有活动的会话
151 log_debug("Disconnecting all multistream sessions");
152 // 使用 log_debug 函数记录一条调试信息,表示正在断开所有多流会话
153 }
154
155 private:
156
157 std::mutex _mutex;
158 // 私有成员变量
159 // _mutex 是一个互斥锁,用于保护对 _sessions 容器的并发访问
160 // if there is only one session, then we use atomic
162 // if there are more than one session, we use vector of sessions with mutex
163 std::vector<std::shared_ptr<Session>> _sessions;
164 // _sessions 是一个向量(动态数组),存储了多个指向 Session 对象的智能指针
165 // 这些智能指针是 std::shared_ptr 类型,它们自动管理 Session 对象的生命周期
166 // 当没有任何 std::shared_ptr 指向一个 Session 对象时,该对象会被自动删除
167 bool _force_active {false}; // _force_active 是一个布尔变量,用于指示是否存在一个或多个会话被强制标记为活动状态
168 // 如果为 true,则可能表示有会话需要被特别处理,即使按照正常逻辑它们可能不应该处于活动状态
169 // 初始化为 false,表示默认没有会话被强制标记为活动状态
170 bool _enabled_for_ros {false}; // _enabled_for_ros 是一个布尔变量,用于指示该类或其中的会话是否启用了对 ROS(Robot Operating System)的支持
171 // 如果为 true,则可能表示该类或其中的会话能够与 ROS 系统进行交互,例如发送或接收消息
172 // 类的其他成员变量、方法和构造函数应该在这里定义
173 // 注意:这些变量是公开的(public),但在实际设计中,您可能希望将它们设为私有(private)
174 // 并通过公共的 getter 和 setter 方法来访问它们,以封装类的内部状态
175 };
176
177} // namespace detail
178} // namespace streaming
179} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
包含 Carla 框架中与网络流相关的类和函数的声明。
包含StreamStateBase类的定义,它是流状态的基础类。
线程安全的原子智能指针封装类
A stream state that can hold any number of sessions.
void ClearSessions() final
清除所有会话。
void DisconnectSession(std::shared_ptr< Session > session) final
断开与会话的连接。
std::vector< std::shared_ptr< Session > > _sessions
void ConnectSession(std::shared_ptr< Session > session) final
连接到会话。
所有流副本之间的共享状态类。如果处于活动状态,则提供对底层服务器会话的访问。
StreamStateBase(const token_type &token)
构造函数,使用给定的令牌初始化对象。
const token_type & token() const
获取用于初始化对象的令牌。
static auto MakeMessage(Buffers... buffers)
创建消息。
静态断言,用于确保token_data结构体的大小与Token::data的大小相同。
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_debug(Args &&... args)
Definition Logging.h:71