Skip to content

Commit 591bc73

Browse files
committed
added reaction internals class that would help users define reactions for reactors and would make sure user functions don't use unintended ports and actions
1 parent 5058c3c commit 591bc73

File tree

7 files changed

+405
-316
lines changed

7 files changed

+405
-316
lines changed

examples/sdk-WorkersParams/main.cc

Lines changed: 302 additions & 248 deletions
Large diffs are not rendered by default.

include/reactor-sdk/BaseTrigger.hh

Lines changed: 0 additions & 20 deletions
This file was deleted.

include/reactor-sdk/Reaction.hh

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

33
#include "reactor-cpp/reactor-cpp.hh"
4-
#include "BaseTrigger.hh"
4+
#include "ReactionBase.hh"
55
#include "Reactor.hh"
66

77
namespace sdk
@@ -26,7 +26,7 @@ inline constexpr bool is_specialization_v = is_specialization<T, Template>::valu
2626

2727

2828
template <typename InputTuple, typename DependencyTuple, typename OutputTuple>
29-
class ReactionOutput: public BaseTrigger
29+
class ReactionOutput: public ReactionBase
3030
{
3131
private:
3232
InputTuple input_triggers;
@@ -35,28 +35,32 @@ private:
3535

3636
public:
3737
explicit ReactionOutput(std::string name, Reactor *parent, InputTuple inputs, DependencyTuple deps, OutputTuple outputs)
38-
: BaseTrigger (name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)) {}
38+
: ReactionBase (name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)) {}
3939
~ReactionOutput() {}
4040

4141
template <typename Fn>
4242
Reaction<Fn, InputTuple, DependencyTuple, OutputTuple> &function(Fn func)
4343
{
44+
if (sizeof(func) != sizeof(void*)) {
45+
reactor::log::Error() << "Reactor: " << reactor->fqn() << " Reaction: " << name << " Accesses variables outside of its scope";
46+
exit(EXIT_FAILURE);
47+
}
4448
auto ReactionRef = std::make_shared<Reaction<Fn, InputTuple, DependencyTuple, OutputTuple>> (name, reactor, std::move(input_triggers), std::move(dependencies), std::move(output_triggers), std::forward<Fn>(func));
4549
ReactionRef->execute();
4650
return *ReactionRef;
4751
}
4852
};
4953

5054
template <typename InputTuple, typename DependencyTuple>
51-
class ReactionDependency: public BaseTrigger
55+
class ReactionDependency: public ReactionBase
5256
{
5357
private:
5458
InputTuple input_triggers;
5559
DependencyTuple dependencies;
5660

5761
public:
5862
explicit ReactionDependency(std::string name, Reactor *parent, InputTuple inputs, DependencyTuple deps)
59-
: BaseTrigger (name, parent), input_triggers(inputs), dependencies(std::move(deps)) {}
63+
: ReactionBase (name, parent), input_triggers(inputs), dependencies(std::move(deps)) {}
6064
~ReactionDependency() {}
6165

6266
template <typename... Outputs>
@@ -70,14 +74,14 @@ public:
7074
};
7175

7276
template <typename InputTuple>
73-
class ReactionInput: public BaseTrigger
77+
class ReactionInput: public ReactionBase
7478
{
7579
private:
7680
InputTuple input_triggers;
7781

7882
public:
7983
explicit ReactionInput(std::string name, Reactor *parent, InputTuple inputs)
80-
: BaseTrigger (name, parent), input_triggers(std::move(inputs)) {}
84+
: ReactionBase (name, parent), input_triggers(std::move(inputs)) {}
8185
~ReactionInput() {}
8286

8387
template <typename... Dependencies>
@@ -90,8 +94,27 @@ public:
9094
}
9195
};
9296

97+
class ReactionName: public ReactionBase {
98+
public:
99+
explicit ReactionName(std::string name, Reactor *parent)
100+
: ReactionBase (name, parent) {}
101+
~ReactionName() = default;
102+
103+
template <typename... Inputs>
104+
ReactionInput<std::tuple<Inputs...>> &triggers(Inputs&&... inputs)
105+
{
106+
auto input_tuple = std::make_tuple(inputs...);
107+
auto ReactionInputRef = std::make_shared<ReactionInput<std::tuple<Inputs...>>> (name, reactor, std::move(input_tuple));
108+
next = ReactionInputRef;
109+
return *ReactionInputRef;
110+
}
111+
112+
// template <typename ReactorType, typename ParameterType>
113+
// friend class ReactionInternals;
114+
};
115+
93116
template <typename Fn, typename InputTuple, typename DependencyTuple, typename OutputTuple>
94-
class Reaction: public BaseTrigger
117+
class Reaction: public ReactionBase
95118
{
96119
private:
97120
InputTuple input_triggers;
@@ -195,7 +218,7 @@ private:
195218

196219
public:
197220
Reaction(std::string name, Reactor *parent, InputTuple inputs, DependencyTuple deps, OutputTuple outputs, Fn func)
198-
: BaseTrigger(name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)), user_function(std::forward<Fn>(func)) { /* std::cout << "Creating Reaction\n"; */ }
221+
: ReactionBase(name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)), user_function(std::forward<Fn>(func)) { /* std::cout << "Creating Reaction\n"; */ }
199222
~Reaction() {}
200223

201224
void execute () {
@@ -222,7 +245,6 @@ public:
222245
set_input_triggers(reaction, input_triggers);
223246
set_dependencies(reaction, dependencies);
224247
set_output_triggers(reaction, output_triggers);
225-
226248
}
227249

228250
template <typename Dfn>
@@ -248,4 +270,34 @@ public:
248270
}
249271
};
250272

273+
template <typename ReactorType, typename ParameterType>
274+
class ReactionInternals : public ReactionBase {
275+
ReactorType *reactor_;
276+
277+
protected:
278+
const ParameterType &parameters;
279+
public:
280+
ReactionInternals(Reactor *owner, ParameterType &param)
281+
: ReactionBase("reaction-internals", owner), reactor_((ReactorType*) owner), parameters(param) {
282+
reactor_->add_reaction_internals(this);
283+
}
284+
285+
ReactionName &reaction (const std::string name) {
286+
auto ReactionNameRef = std::make_shared<ReactionName>(name, reactor);
287+
next = ReactionNameRef;
288+
return *ReactionNameRef;
289+
}
290+
291+
virtual void add_reactions(ReactorType *reactor) = 0;
292+
virtual void assemble() override {
293+
add_reactions(reactor_);
294+
}
295+
296+
auto fqn() const noexcept -> const std::string& { return reactor_->fqn(); }
297+
auto get_elapsed_logical_time() const noexcept -> Duration { return reactor_->get_elapsed_logical_time(); }
298+
auto get_microstep() const noexcept -> reactor::mstep_t { return reactor_->get_microstep(); }
299+
auto get_elapsed_physical_time() const noexcept -> Duration { return reactor_->get_elapsed_physical_time(); }
300+
void request_stop() { reactor_->environment()->sync_shutdown(); }
301+
};
302+
251303
} // namespace sdk
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
namespace sdk
4+
{
5+
class Reactor;
6+
7+
class ReactionBase : public std::enable_shared_from_this<ReactionBase>
8+
{
9+
public:
10+
Reactor *reactor;
11+
std::shared_ptr<ReactionBase> next;
12+
std::string name;
13+
14+
public:
15+
ReactionBase(std::string name, Reactor *parent)
16+
: reactor(parent), next(nullptr), name(name) {}
17+
virtual ~ReactionBase() = default;
18+
19+
virtual void assemble() {}
20+
};
21+
22+
} // namespace sdk

include/reactor-sdk/Reactor.hh

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include "reactor-cpp/reactor-cpp.hh"
44
#include <string.h>
5-
#include "BaseTrigger.hh"
5+
#include "ReactionBase.hh"
66
#include "SystemParameterBase.hh"
77
#include "Environment.hh"
88

@@ -91,14 +91,14 @@ private:
9191
SystemParameterBase *p_param = nullptr;
9292
Environment *env{nullptr};
9393
Reactor *parent{nullptr};
94-
std::string current_reaction_name;
95-
std::unordered_map<std::string, std::shared_ptr<BaseTrigger>> reaction_map;
94+
std::unordered_map<std::string, std::shared_ptr<ReactionBase>> reaction_map;
95+
ReactionBase *reaction_internals_;
9696
int priority = 1;
9797
std::set<Reactor*> child_reactors;
9898
std::string homog_name = "";
9999

100100
void add_child(Reactor* reactor);
101-
void add_to_reaction_map (std::string &name, std::shared_ptr<BaseTrigger> reaction);
101+
void add_to_reaction_map (std::string &name, std::shared_ptr<ReactionBase> reaction);
102102
int get_priority() { return priority++;}
103103

104104
template <typename Fn, typename... InputTriggers, typename... Dependencies, typename... OutputTriggers>
@@ -125,38 +125,21 @@ public:
125125
Reactor(const std::string &name, Environment *env);
126126
Reactor(const std::string &name, Reactor *container);
127127

128+
void add_reaction_internals (ReactionBase* internals) {
129+
reaction_internals_ = internals;
130+
}
131+
128132
static std::string BankName(const std::string& name);
129133
static std::string HomogName(const std::string& name);
130134

131135
void set_param (SystemParameterBase *param) { p_param = param; }
132136

133137
Environment *get_env() { return env; }
134138

135-
Reactor &reaction (const std::string name);
136-
137139
auto homog_fqn() const noexcept -> const std::string& { return homog_name; }
138140

139-
template <typename... Inputs>
140-
ReactionInput<std::tuple<Inputs...>> &operator()(Inputs&&... inputs)
141-
{
142-
auto input_tuple = std::make_tuple(inputs...);
143-
auto ReactionInputRef = std::make_shared<ReactionInput<std::tuple<Inputs...>>> (current_reaction_name, this, std::move(input_tuple));
144-
reaction_map[current_reaction_name] = ReactionInputRef;
145-
return *ReactionInputRef;
146-
}
147-
148-
template <typename... Inputs>
149-
ReactionInput<std::tuple<Inputs...>> &triggers(Inputs&&... inputs)
150-
{
151-
auto input_tuple = std::make_tuple(inputs...);
152-
auto ReactionInputRef = std::make_shared<ReactionInput<std::tuple<Inputs...>>> (current_reaction_name, this, std::move(input_tuple));
153-
reaction_map[current_reaction_name] = ReactionInputRef;
154-
return *ReactionInputRef;
155-
}
156-
157-
void request_stop() { environment()->sync_shutdown(); }
158141
virtual void construction() = 0;
159-
virtual void assembling() = 0;
142+
virtual void wiring() = 0;
160143
void construct() override;
161144
void assemble() override;
162145

include/reactor-sdk/SystemParameters.hh

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct ParameterMetadata {
4747
ParameterMetadata<Type> variable_name = ParameterMetadata<Type>{ #variable_name, description, min_value, max_value, default_value, #Type }
4848

4949
template <typename... ParameterValueType>
50-
class SystemParameter : public SystemParameterBase {
50+
class SystemParametersStandalone : public SystemParameterBase {
5151
public:
5252
using ParameterValue = std::variant<ParameterMetadata<ParameterValueType>*...>;
5353

@@ -56,7 +56,7 @@ public:
5656
ParameterValue param;
5757
};
5858

59-
SystemParameter(Reactor *owner)
59+
SystemParametersStandalone(Reactor *owner)
6060
: reactor(owner), env(owner->get_env()) {
6161
reactor->set_param (this);
6262
}
@@ -142,11 +142,11 @@ private:
142142
};
143143

144144
template <typename Defaults, typename... ParameterValueType>
145-
class SystemParameterWithDefault : public SystemParameter<ParameterValueType...> {
145+
class SystemParameters : public SystemParametersStandalone<ParameterValueType...> {
146146
public:
147147
Defaults defaults;
148-
SystemParameterWithDefault(Reactor *owner, Defaults &&param)
149-
: SystemParameter<ParameterValueType...>(owner), defaults(std::forward<Defaults>(param)) {}
148+
SystemParameters(Reactor *owner, Defaults &&param)
149+
: SystemParametersStandalone<ParameterValueType...>(owner), defaults(std::forward<Defaults>(param)) {}
150150
};
151151

152152
} // namespace sdk

reactor-sdk/Reactor.cc

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,21 @@ void Reactor::add_child(Reactor* reactor) {
4444
reactor_assert(result);
4545
}
4646

47-
void Reactor::add_to_reaction_map (std::string &name, std::shared_ptr<BaseTrigger> reaction) {
47+
void Reactor::add_to_reaction_map (std::string &name, std::shared_ptr<ReactionBase> reaction) {
4848
reaction_map[name] = reaction;
4949
}
5050

51-
Reactor &Reactor::reaction (const std::string name) {
52-
current_reaction_name = name;
53-
return *this;
54-
}
55-
5651
void Reactor::construct() {
5752
if (p_param) {
5853
p_param->fetch_config();
5954
}
6055
construction();
6156
}
6257
void Reactor::assemble() {
63-
assembling();
58+
if (reaction_internals_) {
59+
reaction_internals_->assemble();
60+
}
61+
wiring();
6462
}
6563

6664
void Reactor::populate_params(std::set<std::string> &types, std::map<std::string, std::string> &homog_map_entries, std::map<std::string, std::string> &hetero_map_entries) {

0 commit comments

Comments
 (0)