MakerLabs ACM
node.h
Go to the documentation of this file.
1 /*
2  * Copyright Paul Reimer, 2018
3  *
4  * This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 Unported License.
5  * To view a copy of this license, visit
6  * https://creativecommons.org/licenses/by-nc-sa/4.0/
7  * or send a letter to
8  * Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
9  */
10 
11 #pragma once
12 
13 #include "pid.h"
14 #include "process.h"
15 
16 #include "actor_model_generated.h"
17 
18 #include "delegate.hpp"
19 
20 #include <chrono>
21 #include <experimental/string_view>
22 #include <set>
23 #include <unordered_map>
24 
25 #include "freertos/FreeRTOS.h"
26 #include "freertos/timers.h"
27 
28 namespace ActorModel {
29 
30 using ExecConfigCallback = delegate<void(ProcessExecutionConfigBuilder&)>;
31 using Time = std::chrono::milliseconds;
32 
33 using TRef = size_t;
34 using SignalRef = size_t;
35 using TTL = int;
37 
38 using ModuleFlatbuffer = std::vector<uint8_t>;
39 
40 using FunctionFlatbuffer = flatbuffers::DetachedBuffer;
41 using FunctionMutableFlatbuffer = std::vector<uint8_t>;
42 
43 constexpr TRef NullTRef = 0;
44 constexpr SignalRef NullSignalRef = 0;
45 
47 {
48 public:
50  const Pid& _pid,
51  flatbuffers::DetachedBuffer&& _buf,
52  const bool _is_recurring,
53  const TimerHandle_t _timer_handle
54  )
55  : pid(_pid)
56  , buf(std::move(_buf))
57  , is_recurring(_is_recurring)
58  , timer_handle(_timer_handle)
59  {
60  }
61 
63  flatbuffers::DetachedBuffer buf;
65  TimerHandle_t timer_handle;
66 };
67 
68 class Process;
69 class Node
70 {
71  friend class Process;
72 
73 public:
74  // type aliases:
75  using string = std::string;
77 
78  using ProcessPtr = std::unique_ptr<Process>;
79 
80  using ProcessRegistry = std::unordered_map<
81  Pid,
82  ProcessPtr,
85  >;
86  using NamedProcessRegistry = std::unordered_map<string, Pid>;
87 
88  using ModuleRegistry = std::unordered_map<
89  string,
91  >;
92  using FunctionRegistry = std::unordered_map<
93  string,
95  >;
96 
97  using TimedMessages = std::unordered_map<TRef, TimedBufferDelivery>;
98  using TimedSignals = std::unordered_map<SignalRef, TimedBufferDelivery>;
99 
100  // public constructors/destructors:
101  Node();
102 
103  // Generic behaviour convenience functions
104  auto spawn(
105  const Behaviour&& _behaviour,
106  const ExecConfigCallback&& _exec_config_callback
107  ) -> Pid;
108 
109  auto spawn_link(
110  const Pid& _initial_link_pid,
111  const Behaviour&& _behaviour,
112  const ExecConfigCallback&& _exec_config_callback
113  ) -> Pid;
114 
115  auto process_flag(
116  const Pid& pid,
117  const ProcessFlag flag,
118  const bool flag_setting
119  ) -> bool;
120 
121  auto send(
122  const Pid& pid,
123  const Message& message
124  ) -> bool;
125 
126  auto send(
127  const Pid& pid,
128  const string_view type,
129  const string_view payload
130  ) -> bool;
131 
132  auto send_after(
133  const Time time,
134  const Pid& pid,
135  const Message& message
136  ) -> TRef;
137 
138  auto send_after(
139  const Time time,
140  const Pid& pid,
141  const string_view type,
142  const string_view payload
143  ) -> TRef;
144 
145  auto send_interval(
146  const Time time,
147  const Pid& pid,
148  const Message& message
149  ) -> TRef;
150 
151  auto send_interval(
152  const Time time,
153  const Pid& pid,
154  const string_view type,
155  const string_view payload
156  ) -> TRef;
157 
158  auto cancel(const TRef tref)
159  -> bool;
160 
161  auto cancel_signal(const SignalRef signal_ref)
162  -> bool;
163 
164  auto exit(const Pid& pid, const Pid& pid2, const Reason exit_reason)
165  -> bool;
166 
167  auto register_name(const string_view name, const Pid& pid)
168  -> bool;
169 
170  auto unregister(const string_view name)
171  -> bool;
172 
173  auto registered()
174  -> const NamedProcessRegistry;
175 
176  auto whereis(const string_view name)
177  -> MaybePid;
178 
179  auto module(const string_view module_flatbuffer)
180  -> bool;
181 
182  auto apply(
183  const Pid& pid,
184  const string_view function_name,
185  const string_view args
186  ) -> ResultUnion;
187 
188  auto apply(
189  const Pid& pid,
190  const string_view module_name,
191  const string_view function_name,
192  const string_view args
193  ) -> ResultUnion;
194 
195  auto timer_callback(const TRef tref)
196  -> bool;
197 
198  auto signal_timer_callback(const SignalRef signal_ref)
199  -> bool;
200 
201 protected:
202  auto _spawn(
203  const Behaviour&& _behaviour,
204  const MaybePid& _initial_link_pid = std::experimental::nullopt,
205  const ExecConfigCallback&& _exec_config_callback = nullptr
206  ) -> Pid;
207 
208  auto terminate(const Pid& pid)
209  -> bool;
210 
211  auto signal(const Pid& pid, flatbuffers::DetachedBuffer&& signal_buf)
212  -> SignalRef;
213 
214  auto process_signal(const Pid& pid, const Signal& sig)
215  -> bool;
216 
217  auto start_timer(
218  const Time time,
219  const Pid& pid,
220  flatbuffers::DetachedBuffer&& message_buf,
221  const bool is_recurring = false
222  ) -> TRef;
223 
226 
229 
232 
235 private:
236 };
237 
238 } // namespace ActorModel
size_t SignalRef
Definition: node.h:34
FunctionRegistry function_registry
Definition: node.h:228
TimedSignals timed_signals
Definition: node.h:233
bool is_recurring
Definition: node.h:64
delegate< void(ProcessExecutionConfigBuilder &)> ExecConfigCallback
Definition: node.h:30
Definition: behaviour.h:30
auto start_timer(const Time time, const Pid &pid, flatbuffers::DetachedBuffer &&message_buf, const bool is_recurring=false) -> TRef
Definition: node.cpp:278
ModuleRegistry module_registry
Definition: node.h:227
ProcessRegistry process_registry
Definition: node.h:224
auto send_after(const Time time, const Pid &pid, const Message &message) -> TRef
Definition: node.cpp:182
auto spawn(const Behaviour &&_behaviour, const ExecConfigCallback &&_exec_config_callback) -> Pid
Definition: node.cpp:54
auto _spawn(const Behaviour &&_behaviour, const MaybePid &_initial_link_pid=std::experimental::nullopt, const ExecConfigCallback &&_exec_config_callback=nullptr) -> Pid
Definition: node.cpp:79
Definition: uuid.h:28
Definition: actor.cpp:17
auto unregister(const string_view name) -> bool
Definition: node.cpp:615
auto signal(const Pid &pid, flatbuffers::DetachedBuffer &&signal_buf) -> SignalRef
Definition: node.cpp:333
auto spawn_link(const Pid &_initial_link_pid, const Behaviour &&_behaviour, const ExecConfigCallback &&_exec_config_callback) -> Pid
Definition: node.cpp:66
size_t TRef
Definition: node.h:33
std::experimental::optional< Pid > MaybePid
Definition: pid.h:20
int TTL
Definition: node.h:35
auto module(const string_view module_flatbuffer) -> bool
Definition: node.cpp:693
Process::Reason Reason
Definition: actor_model.cpp:17
auto exit(const Pid &pid, const Pid &pid2, const Reason exit_reason) -> bool
Definition: node.cpp:468
auto cancel(const TRef tref) -> bool
Definition: node.cpp:381
auto whereis(const string_view name) -> MaybePid
Definition: node.cpp:681
auto registered() -> const NamedProcessRegistry
Definition: node.cpp:675
flatbuffers::DetachedBuffer buf
Definition: node.h:63
constexpr TRef NullTRef
Definition: node.h:43
Definition: actor_model.fbs:27
std::unordered_map< string, ModuleFlatbuffer > ModuleRegistry
Definition: node.h:91
std::string string
Definition: oom_killer_actor_behaviour.cpp:24
std::experimental::string_view string_view
Definition: actor_model.cpp:16
ProcessFlag
Definition: actor_model.fbs:22
TimerHandle_t timer_handle
Definition: node.h:65
auto register_name(const string_view name, const Pid &pid) -> bool
Definition: node.cpp:608
UUID::UUID Pid
Definition: pid.h:19
Definition: node.h:46
Definition: node.h:69
std::unordered_map< TRef, TimedBufferDelivery > TimedMessages
Definition: node.h:97
std::vector< uint8_t > FunctionMutableFlatbuffer
Definition: node.h:41
Node()
Definition: node.cpp:49
Definition: process.h:38
Pid pid
Definition: node.h:62
std::unordered_map< Pid, ProcessPtr, UUID::UUIDHashFunc, UUID::UUIDEqualFunc > ProcessRegistry
Definition: node.h:85
std::chrono::milliseconds Time
Definition: node.h:31
TRef next_tref
Definition: node.h:231
TimedMessages timed_messages
Definition: node.h:230
auto process_signal(const Pid &pid, const Signal &sig) -> bool
Definition: node.cpp:539
delegate< ResultUnion(const Pid &, Mailbox &)> Behaviour
Definition: behaviour.h:80
auto signal_timer_callback(const SignalRef signal_ref) -> bool
Definition: node.cpp:520
std::unordered_map< SignalRef, TimedBufferDelivery > TimedSignals
Definition: node.h:98
Definition: uuid.h:22
std::unordered_map< string, Pid > NamedProcessRegistry
Definition: node.h:86
std::string string
Definition: node.h:75
auto process_flag(const Pid &pid, const ProcessFlag flag, const bool flag_setting) -> bool
Definition: node.cpp:129
auto apply(const Pid &pid, const string_view function_name, const string_view args) -> ResultUnion
Definition: node.cpp:727
auto cancel_signal(const SignalRef signal_ref) -> bool
Definition: node.cpp:426
Definition: actor_model.fbs:58
SignalRef next_signal_ref
Definition: node.h:234
constexpr SignalRef NullSignalRef
Definition: node.h:44
auto terminate(const Pid &pid) -> bool
Definition: node.cpp:623
auto timer_callback(const TRef tref) -> bool
Definition: node.cpp:486
std::unordered_map< string, FunctionMutableFlatbuffer > FunctionRegistry
Definition: node.h:95
auto send_interval(const Time time, const Pid &pid, const Message &message) -> TRef
Definition: node.cpp:230
TimedBufferDelivery(const Pid &_pid, flatbuffers::DetachedBuffer &&_buf, const bool _is_recurring, const TimerHandle_t _timer_handle)
Definition: node.h:49
flatbuffers::DetachedBuffer FunctionFlatbuffer
Definition: node.h:40
NamedProcessRegistry named_process_registry
Definition: node.h:225
std::vector< uint8_t > ModuleFlatbuffer
Definition: node.h:38
std::unique_ptr< Process > ProcessPtr
Definition: node.h:78
auto send(const Pid &pid, const Message &message) -> bool
Definition: node.cpp:147
std::experimental::string_view string_view
Definition: node.h:76