11 #include "madara/Boost.h"
15 #ifdef _MADARA_USING_ZMQ_
19 #ifdef _USE_OPEN_SPLICE_
43 if (actual_host ==
"")
47 actual_host = boost::asio::ip::host_name();
49 catch (
const std::exception&)
51 actual_host =
"localhost";
55 if (actual_host.size() > 30)
57 actual_host.resize(30);
62 boost::mt19937 ran(std::random_device{}());
63 auto uuid = boost::uuids::basic_random_generator<boost::mt19937>(ran)();
64 auto uuid_str = boost::uuids::to_string(uuid);
66 std::remove(uuid_str.begin(), uuid_str.end(),
'-'), uuid_str.end());
68 actual_host += uuid_str;
88 "KnowledgeBaseImpl::attach_transport:"
89 " activating transport type %d\n",
95 originator,
map_, settings,
true);
100 originator,
map_, settings,
true);
104 #ifdef _USE_OPEN_SPLICE_
106 "KnowledgeBaseImpl::activate_transport:"
107 " creating Open Splice DDS transport.\n");
110 originator,
map_, settings,
true);
113 "KnowledgeBaseImpl::activate_transport:"
114 " project was not generated with opensplice=1. Transport is "
122 "KnowledgeBaseImpl::activate_transport:"
123 " creating NDDS transport.\n");
126 new madara::transport::NddsTransport(originator,
map_, settings,
true);
129 "KnowledgeBaseImpl::activate_transport:"
130 " project was not generated with ndds=1. Transport is invalid.\n");
136 "KnowledgeBaseImpl::activate_transport:"
137 " creating UDP transport.\n");
144 #ifdef _MADARA_USING_ZMQ_
146 "KnowledgeBaseImpl::activate_transport:"
147 " creating ZMQ transport.\n");
153 "KnowledgeBaseImpl::activate_transport:"
154 " project was not generated with zmq=1. Transport is invalid.\n");
160 "KnowledgeBaseImpl::activate_transport:"
161 " creating UDP Registry Server transport.\n");
164 originator,
map_, settings,
true);
169 "KnowledgeBaseImpl::activate_transport:"
170 " creating UDP Registry Client transport.\n");
173 originator,
map_, settings,
true);
178 "KnowledgeBaseImpl::activate_transport:"
179 " no transport was specified. Setting transport to null.\n");
204 for (
auto& transport : old_transports)
209 "KnowledgeBaseImpl::close_transport:"
210 " transport has been closed\n");
214 #ifndef _MADARA_NO_KARL_
219 "KnowledgeBaseImpl::compile:"
230 return wait(compiled, settings);
250 "KnowledgeBaseImpl::wait:"
257 "KnowledgeBaseImpl::wait:"
258 " completed first eval to get %s\n",
269 "KnowledgeBaseImpl::wait:"
270 " last value didn't result in success\n");
290 "KnowledgeBaseImpl::wait:"
297 "KnowledgeBaseImpl::wait:"
298 " completed eval to get %s\n",
310 "KnowledgeBaseImpl::wait:"
311 " Evaluate did not succeed. Timeout occurred\n");
327 "KnowledgeBaseImpl::evaluate:"
364 "KnowledgeBaseImpl::evaluate:"
365 " evaluating ComponentNode rooted tree\n");
402 "%s: user requested to not send modifieds\n", prefix.c_str());
418 std::unique_lock<MADARA_LOCK_TYPE> send_guard;
424 std::unique_lock<MADARA_LOCK_TYPE>
427 if (!send_guard_tmp.owns_lock())
442 send_guard = std::move(send_guard_tmp);
452 if (transports.size() == 0)
455 "%s: no transport configured\n", prefix.c_str());
463 if (modified.size() == 0)
466 "%s: no modifications to send\n", prefix.c_str());
472 for (
auto& transport : transports)
474 transport->send_data(modified);
utility::EpochEnforcer< std::chrono::steady_clock > EpochEnforcer
#define madara_logger_log(loggering, level,...)
Fast version of the madara::logger::log method.
An abstract base class defines a simple abstract implementation of an expression tree node.
madara::knowledge::KnowledgeRecord evaluate(const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Evaluates the expression tree.
Compiled, optimized KaRL logic.
std::string logic
the logic that was compiled
madara::expression::ExpressionTree expression
the expression tree
MADARA_LOCK_TYPE send_mutex_
MADARA_LOCK_TYPE done_sending_mutex_
std::string setup_unique_hostport(std::string host="")
Creates a random UUID for unique tie breakers in global ordering.
MADARA_LOCK_TYPE transport_mutex_
size_t attach_transport(madara::transport::Base *transport)
Attaches a transport to the Knowledge Engine.
std::vector< std::shared_ptr< transport::Base > > get_transports()
Atomically retrieve the set of transports.
void close_transport(void)
Closes the transport mechanism so no dissemination is possible.
madara::knowledge::KnowledgeRecord evaluate(const std::string &expression)
Evaluates an expression.
CompiledExpression compile(const std::string &expression)
Compiles a KaRL expression into an expression tree.
MADARA_EXPORT int send_modifieds(const std::string &prefix, const EvalSettings &settings=EvalSettings::SEND)
Sends all modified variables through the attached transports.
madara::knowledge::KnowledgeRecord wait(const std::string &expression)
Waits for an expression to be non-zero.
std::vector< std::shared_ptr< transport::Base > > transports_
This class encapsulates an entry in a KnowledgeBase.
std::string to_string(const std::string &delimiter=", ") const
converts the value to a string.
Integer to_integer(void) const
converts the value to an integer.
bool signal_changes
Toggle whether to signal changes have happened.
CompiledExpression compile(const std::string &expression)
Compiles a KaRL expression into an expression tree.
logger::Logger & get_logger(void) const
Gets the logger used for information printing.
void signal(bool lock=true) const
Signals that this thread is done with the context.
knowledge::KnowledgeRecord evaluate(CompiledExpression expression, const KnowledgeUpdateSettings &settings=KnowledgeUpdateSettings())
Evaluate a compiled expression.
KnowledgeMap get_modifieds_current(const std::map< std::string, bool > &send_list, bool reset=true)
Retrieves the current modifieds map.
uint64_t inc_clock(const KnowledgeUpdateSettings &settings=KnowledgeUpdateSettings())
Atomically increments the Lamport clock and returns the new clock time (intended for sending knowledg...
void print(unsigned int level) const
Atomically prints all variables and values in the context.
void wait_for_change(bool extra_release=false)
Wait for a change to happen to the context.
Base class from which all transports must be derived.
Broadcast-based transport for knowledge.
Multicast-based transport for knowledge.
This class provides an interface into the Open Splice dissemination transport.
Holds basic transport settings.
uint32_t type
Type of transport. See madara::transport::Types for options.
UDP-based transport for knowledge.
UDP-based server that handles a registry of UDP endpoints, which makes it ideal for any NAT-protected...
UDP-based transport for knowledge.
ZMQ-based transport for knowledge.
Enforces a periodic epoch.
bool is_done(void) const
Checks to see if max duration is finished.
void sleep_until_next(void)
Sleeps until the next epoch.
Provides functions and classes for the distributed knowledge base.
Provides utility functions and classes for common tasks and needs.
Copyright(c) 2020 Galois.
Encapsulates settings for an evaluation statement.
std::map< std::string, bool > send_list
Map of record names that are allowed to be sent after operation.
std::string post_print_statement
Statement to print after evaluations.
bool delay_sending_modifieds
Toggle for sending modifieds in a single update event after each evaluation.
std::string pre_print_statement
Statement to print before evaluations.
Encapsulates settings for a wait statement.
double max_wait_time
Maximum time to wait for an expression to become true (in seconds)
double poll_frequency
Frequency to poll an expression for truth (in seconds)