CARLA
Loading...
Searching...
No Matches
MultiStreamState.h
Go to the documentation of this file.
1// Copyright (c) 2026 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#include "carla/Logging.h"
13
14#include <mutex>
15#include <vector>
16#include <atomic>
17
18namespace carla {
19namespace streaming {
20namespace detail {
21
22 /// A stream state that can hold any number of sessions.
23 ///
24 /// @todo Lacking some optimization.
25 class MultiStreamState final : public StreamStateBase {
26 public:
27
29
34
35 template <typename... Buffers>
36 void Write(Buffers... buffers) {
37 // try write single stream
38 auto session = _session.load();
39 if (session != nullptr) {
40 auto message = Session::MakeMessage(buffers...);
41 session->Write(std::move(message));
42 log_debug("sensor ", session->get_stream_id()," data sent");
43 // Return here, _session is only valid if we have a
44 // single session.
45 return;
46 }
47
48 // try write multiple stream
49 std::scoped_lock<std::mutex> lock(_mutex);
50 if (_sessions.size() > 0) {
51 auto message = Session::MakeMessage(buffers...);
52 for (auto &s : _sessions) {
53 if (s != nullptr) {
54 s->Write(message);
55 log_debug("sensor ", s->get_stream_id()," data sent ");
56 }
57 }
58 }
59 }
60
61 void ForceActive() {
62 _force_active = true;
63 }
64
65 void EnableForROS() {
66 _enabled_for_ros = true;
67 }
68
70 _enabled_for_ros = false;
71 }
72
74 return _enabled_for_ros;
75 }
76
78 return (_sessions.size() > 0 || _force_active || _enabled_for_ros);
79 }
80
81 void ConnectSession(std::shared_ptr<Session> session) final {
82 DEBUG_ASSERT(session != nullptr);
83 std::scoped_lock<std::mutex> lock(_mutex);
84 _sessions.emplace_back(std::move(session));
85 log_debug("Connecting multistream sessions:", _sessions.size());
86 if (_sessions.size() == 1) {
87 _session.store(_sessions[0]);
88 }
89 else if (_sessions.size() > 1) {
90 _session.store(nullptr);
91 }
92 }
93
94 void DisconnectSession(std::shared_ptr<Session> session) final {
95 DEBUG_ASSERT(session != nullptr);
96 std::scoped_lock<std::mutex> lock(_mutex);
97 log_debug("Calling DisconnectSession for ", session->get_stream_id());
98 if (_sessions.size() == 0) return;
99 if (_sessions.size() == 1) {
100 if (_sessions[0] != session) {
101 return;
102 }
103 _session.store(nullptr);
104 _sessions.clear();
105 _force_active = false;
106 log_debug("Last session disconnected");
107 } else {
108 _sessions.erase(
109 std::remove(_sessions.begin(), _sessions.end(), session),
110 _sessions.end());
111
112 // set single session if only one
113 if (_sessions.size() == 1)
114 _session.store(_sessions[0]);
115 else
116 _session.store(nullptr);
117 }
118 log_debug("Disconnecting multistream sessions:", _sessions.size());
119 }
120
121 void ClearSessions() final {
122 std::scoped_lock<std::mutex> lock(_mutex);
123 for (auto &s : _sessions) {
124 if (s != nullptr) {
125 s->Close();
126 }
127 }
128 _sessions.clear();
129 _force_active = false;
130 _session.store(nullptr);
131 log_debug("Disconnecting all multistream sessions");
132 }
133
134 private:
135
136 std::mutex _mutex;
137
138 // if there is only one session, then we use atomic
140 // if there are more than one session, we use vector of sessions with mutex
141 std::vector<std::shared_ptr<Session>> _sessions;
142 bool _force_active {false};
143 bool _enabled_for_ros {false};
144 };
145
146} // namespace detail
147} // namespace streaming
148} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:66
A very simple atomic shared ptr with release-acquire memory order.
A stream state that can hold any number of sessions.
void DisconnectSession(std::shared_ptr< Session > session) final
std::vector< std::shared_ptr< Session > > _sessions
void ConnectSession(std::shared_ptr< Session > session) final
Shared state among all the copies of a stream.
static auto MakeMessage(Buffers... buffers)
Serializes a stream endpoint.
This file contains definitions of common data structures used in traffic manager.
static void log_debug(Args &&... args)
Definition Logging.h:68