helics 3.7.0
Loading...
Searching...
No Matches
CommsInterface.hpp
1/*
2Copyright (c) 2017-2026,
3Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Energy
4Innovation LLC. See the top-level NOTICE for additional details. All rights reserved.
5SPDX-License-Identifier: BSD-3-Clause
6*/
7#pragma once
8
9#include "NetworkBrokerData.hpp"
10#include "gmlc/concurrency/TriggerVariable.hpp"
11#include "gmlc/concurrency/TripWire.hpp"
12#include "gmlc/containers/BlockingPriorityQueue.hpp"
13#include "helics/core/ActionMessage.hpp"
14
15#include <functional>
16#include <memory>
17#include <string>
18#include <thread>
19#include <utility>
20
21namespace helics {
22
26 public:
29 enum class thread_generation {
30 single,
31 dual
32 };
34 CommsInterface() = default;
35 explicit CommsInterface(thread_generation threads);
37 virtual ~CommsInterface();
38
40 virtual void loadNetworkInfo(const NetworkBrokerData& netInfo);
41 void loadTargetInfo(std::string_view localTarget,
42 std::string_view brokerTarget,
43 gmlc::networking::InterfaceNetworks targetNetwork =
44 gmlc::networking::InterfaceNetworks::LOCAL);
47 void transmit(route_id rid, const ActionMessage& cmd);
50 void transmit(route_id rid, ActionMessage&& cmd);
53 void addRoute(route_id rid, std::string_view routeInfo);
55 void removeRoute(route_id rid);
59 bool connect();
60
63 void disconnect();
64
66 bool reconnect();
68 void setName(const std::string& commName);
69
72 void setRequireBrokerConnection(bool requireBrokerConnection);
73
76 void setCallback(std::function<void(ActionMessage&&)> callback);
80 std::function<void(int level, std::string_view name, std::string_view message)> callback);
83 void setMessageSize(int maxMsgSize, int maxCount);
86 bool isConnected() const;
87
91 void setTimeout(std::chrono::milliseconds timeOut);
93 virtual void setFlag(std::string_view flag, bool val);
95 void setServerMode(bool serverActive);
96
98 void logWarning(std::string_view message) const;
100 void logError(std::string_view message) const;
102 void logMessage(std::string_view message) const;
103
104 protected:
107 enum class ConnectionStatus : int {
108
109 STARTUP = -1,
110 CONNECTED = 0,
111 RECONNECTING = 1,
112 TERMINATED = 2,
113 ERRORED = 4
114 };
115
116 private:
118 std::atomic<ConnectionStatus> rxStatus{ConnectionStatus::STARTUP};
119
120 protected:
121 gmlc::concurrency::TriggerVariable rxTrigger;
122
123 std::string name;
124 std::string localTargetAddress;
126 std::string brokerName;
128 std::string brokerInitString;
129
130 private:
131 std::string randomID;
133 std::atomic<ConnectionStatus> txStatus{ConnectionStatus::STARTUP};
134 gmlc::concurrency::TriggerVariable txTrigger;
135 std::atomic<bool> operating{false};
136 const bool singleThread{false};
137
138 protected:
140 false};
141 bool serverMode{true};
142 bool autoBroker{false};
144 bool observer{false};
146 std::chrono::milliseconds connectionTimeout{4000};
147 int maxMessageSize = 16 * 1024;
148 int maxMessageCount = 512;
149 std::atomic<bool> requestDisconnect{false};
150 std::function<void(ActionMessage&&)>
152 std::function<void(int level, std::string_view name, std::string_view message)>
154 gmlc::containers::BlockingPriorityQueue<std::pair<route_id, ActionMessage>>
156 // closing the files or connection can take some time so there is a need for inter-thread
157 // communication to not spit out warning messages if it is in the process of disconnecting
158 std::atomic<bool> disconnecting{
159 false};
160 gmlc::networking::InterfaceNetworks interfaceNetwork{
161 gmlc::networking::InterfaceNetworks::LOCAL};
162
163 private:
164 std::thread queue_transmitter;
165 std::thread queue_watcher;
166 std::mutex threadSyncLock;
167 virtual void queue_rx_function() = 0;
168 virtual void queue_tx_function() = 0;
169 virtual void closeTransmitter();
170 virtual void closeReceiver();
171 virtual void reconnectTransmitter();
172 virtual void reconnectReceiver();
173 protected:
174 void setTxStatus(ConnectionStatus status);
175 void setRxStatus(ConnectionStatus status);
176 ConnectionStatus getRxStatus() const { return rxStatus.load(); }
177 ConnectionStatus getTxStatus() const { return txStatus.load(); }
180 bool propertyLock();
181 void propertyUnLock();
183 void join_tx_rx_thread();
185 const std::string& getRandomID() const { return randomID; }
187 bool isShutdownTripped() const { return tripDetector.isTripped(); }
188
189 private:
190 gmlc::concurrency::TripWireDetector
191 tripDetector;
192};
193
194namespace CommFactory {
197 public:
198 virtual std::unique_ptr<CommsInterface> build() = 0;
199 };
200
202 template<class CommTYPE>
203 class CommTypeBuilder final: public CommBuilder {
204 public:
205 static_assert(std::is_base_of<CommsInterface, CommTYPE>::value,
206 "Type does not inherit from helics::CommsInterface");
207
208 using comm_build_type = CommTYPE;
209 virtual std::unique_ptr<CommsInterface> build() override
210 {
211 return std::make_unique<CommTYPE>();
212 }
213 };
214
216 void defineCommBuilder(std::shared_ptr<CommBuilder> builder,
217 std::string_view commTypeName,
218 int code);
219
221 template<class CommTYPE>
222 std::shared_ptr<CommBuilder> addCommType(std::string_view commTypeName, int code)
223 {
224 auto bld = std::make_shared<CommTypeBuilder<CommTYPE>>();
225 std::shared_ptr<CommBuilder> cbld = std::static_pointer_cast<CommBuilder>(bld);
226 defineCommBuilder(cbld, commTypeName, code);
227 return cbld;
228 }
229
230 std::unique_ptr<CommsInterface> create(CoreType type);
231 std::unique_ptr<CommsInterface> create(std::string_view type);
232
233} // namespace CommFactory
234
235template<class X>
237 private:
238 std::atomic<X>& aref;
239 X fval;
240 X expectedValue;
241
242 public:
243 ConditionalChangeOnDestroy(std::atomic<X>& var, X finalValue, X expValue):
244 aref(var), fval(std::move(finalValue)), expectedValue(std::move(expValue))
245 {
246 }
247 ~ConditionalChangeOnDestroy() { aref.compare_exchange_strong(expectedValue, fval); }
248};
249
250} // namespace helics
Definition ActionMessage.hpp:30
Definition CommsInterface.hpp:196
Definition CommsInterface.hpp:203
Definition CommsInterface.hpp:25
void setRequireBrokerConnection(bool requireBrokerConnection)
Definition CommsInterface.cpp:398
ConnectionStatus
Definition CommsInterface.hpp:107
@ STARTUP
the connection is in STARTUP mode
@ TERMINATED
the connection has been TERMINATED
@ RECONNECTING
we are trying reconnect
@ ERRORED
some ERRORED occurred on the connection
void join_tx_rx_thread()
Definition CommsInterface.cpp:514
std::string name
the name of the object
Definition CommsInterface.hpp:123
void transmit(route_id rid, const ActionMessage &cmd)
Definition CommsInterface.cpp:199
thread_generation
Definition CommsInterface.hpp:29
@ dual
indicate that separate threads are used, 1 for transmission and 1 for reception
@ single
indicate that a single thread is used for transmitting and receiving
void setName(const std::string &commName)
Definition CommsInterface.cpp:406
virtual void setFlag(std::string_view flag, bool val)
Definition CommsInterface.cpp:595
std::function< void(int level, std::string_view name, std::string_view message)> loggingCallback
callback for logging
Definition CommsInterface.hpp:153
int maxMessageCount
the maximum number of message to buffer (if needed)
Definition CommsInterface.hpp:148
void setTimeout(std::chrono::milliseconds timeOut)
Definition CommsInterface.cpp:606
bool reconnect()
Definition CommsInterface.cpp:535
void removeRoute(route_id rid)
Definition CommsInterface.cpp:226
bool propertyLock()
Definition CommsInterface.cpp:182
void disconnect()
Definition CommsInterface.cpp:414
int maxMessageSize
the maximum message size for the queues (if needed)
Definition CommsInterface.hpp:147
void setServerMode(bool serverActive)
Definition CommsInterface.cpp:614
bool serverMode
some comms have a server mode and non-server mode
Definition CommsInterface.hpp:141
bool observer
true for connections that are for observation only
Definition CommsInterface.hpp:144
void logMessage(std::string_view message) const
Definition CommsInterface.cpp:627
virtual ~CommsInterface()
Definition CommsInterface.cpp:128
virtual void loadNetworkInfo(const NetworkBrokerData &netInfo)
Definition CommsInterface.cpp:133
bool autoBroker
the broker should be automatically generated if needed
Definition CommsInterface.hpp:142
std::chrono::milliseconds connectionTimeout
Definition CommsInterface.hpp:146
void setMessageSize(int maxMsgSize, int maxCount)
Definition CommsInterface.cpp:582
bool isConnected() const
Definition CommsInterface.cpp:622
std::string localTargetAddress
the base for the receive address
Definition CommsInterface.hpp:124
void setCallback(std::function< void(ActionMessage &&)> callback)
Definition CommsInterface.cpp:565
std::function< void(ActionMessage &&)> ActionCallback
the callback for what to do with a received message
Definition CommsInterface.hpp:151
std::string brokerTargetAddress
the base for the broker address
Definition CommsInterface.hpp:125
void logWarning(std::string_view message) const
Definition CommsInterface.cpp:636
std::string brokerInitString
the initialization string for any automatically generated broker
Definition CommsInterface.hpp:128
bool isShutdownTripped() const
Definition CommsInterface.hpp:187
std::string brokerName
Definition CommsInterface.hpp:126
bool useJsonSerialization
true to make all connections use JSON serialization
Definition CommsInterface.hpp:143
const std::string & getRandomID() const
Definition CommsInterface.hpp:185
void logError(std::string_view message) const
Definition CommsInterface.cpp:645
bool connect()
Definition CommsInterface.cpp:291
std::atomic< bool > disconnecting
flag indicating that the comm system is in the process of disconnecting
Definition CommsInterface.hpp:158
void addRoute(route_id rid, std::string_view routeInfo)
Definition CommsInterface.cpp:217
void setLoggingCallback(std::function< void(int level, std::string_view name, std::string_view message)> callback)
Definition CommsInterface.cpp:573
std::atomic< bool > requestDisconnect
flag gets set when disconnect is called
Definition CommsInterface.hpp:149
bool mRequireBrokerConnection
specify that the comms should assume we have a broker
Definition CommsInterface.hpp:139
gmlc::containers::BlockingPriorityQueue< std::pair< route_id, ActionMessage > > txQueue
set of messages waiting to be transmitted
Definition CommsInterface.hpp:155
Definition CommsInterface.hpp:236
Definition NetworkBrokerData.hpp:23
Definition GlobalFederateId.hpp:187
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition AsyncFedCallInfo.hpp:14
CoreType
Definition CoreTypes.hpp:46