MakerLabs ACM
process.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 "behaviour.h"
14 #include "mailbox.h"
15 #include "node.h"
16 #include "pid.h"
17 
18 #include "actor_model_generated.h"
19 
20 #include <experimental/string_view>
21 
22 #include <unordered_map>
23 #include <unordered_set>
24 
25 #include "freertos/FreeRTOS.h"
26 #include "freertos/task.h"
27 #include "freertos/timers.h"
28 
29 namespace ActorModel {
30 
31 static ResultUnion Ok;
34 
35 class Node;
36 class Process;
37 
38 class Process
39 {
40  friend class Node;
41 public:
42  // type aliases:
44  using LinkList = std::unordered_set<Pid, UUID::UUIDHashFunc, UUID::UUIDEqualFunc>;
45  using MonitorList = std::unordered_set<Pid, UUID::UUIDHashFunc, UUID::UUIDEqualFunc>;
46 
48 
50  {
51  auto operator()(const ProcessFlag& flag) const
52  -> size_t
53  {
54  return static_cast<size_t>(flag);
55  }
56  };
57 
58  using ProcessFlags = std::unordered_map<
60  bool,
61  ProcessFlagHashFunc
62  >;
63 
65  {
66  using AncestorList = std::vector<Pid>;
67 
69  };
70 
71  virtual ~Process();
72 
73  auto _execute()
74  -> ResultUnion;
75 
76 protected:
77  Process(
78  const Pid& _pid,
79  const Behaviour&& _behaviour,
80  const ProcessExecutionConfig& execution_config = get_default_execution_config(),
81  const MaybePid& initial_link_pid = std::experimental::nullopt,
82  const ProcessDictionary::AncestorList&& _ancestors = {},
83  Node* const _current_node = nullptr
84  );
85 
86  auto get_current_node()
87  -> Node&;
88 
89  auto process_flag(const ProcessFlag flag, const bool flag_setting)
90  -> bool;
91 
92  auto get_process_flag(const ProcessFlag flag)
93  -> bool;
94 
95  auto exit(const Reason exit_reason)
96  -> bool;
97 
98  auto link(const Pid& pid2)
99  -> bool;
100  auto unlink(const Pid& pid2)
101  -> bool;
102 
103  auto send(const Message& message)
104  -> bool;
105  auto send(const string_view type, const string_view payload)
106  -> bool;
107 
108  const Pid pid;
109 
112 
113  // References to other processes:
115  //MonitorList monitors;
116 
117  // Process metadata:
120 
122  SemaphoreHandle_t receive_semaphore = nullptr;
123 
124  Node* const current_node = nullptr;
125 
126 private:
127  TaskHandle_t impl = nullptr;
128  bool started = false;
129 
130  static flatbuffers::FlatBufferBuilder _default_execution_config_fbb;
131  static const ProcessExecutionConfig* _default_execution_config;
132 
133 // static methods:
134 public:
135  static auto get_default_node()
136  -> Node&;
137 
138  static auto get_default_execution_config()
139  -> const ProcessExecutionConfig&;
140 };
141 
142 } // namespace ActorModel
static auto get_default_node() -> Node &
Definition: process.cpp:224
auto send(const Message &message) -> bool
Definition: process.cpp:121
Definition: actor_model.fbs:115
std::experimental::string_view Reason
Definition: process.h:43
std::experimental::string_view string_view
Definition: process.h:47
Definition: behaviour.h:30
Definition: mailbox.h:31
auto get_process_flag(const ProcessFlag flag) -> bool
Definition: process.cpp:206
std::string exit_reason
Definition: process.h:121
static ResultUnion Done
Definition: process.h:32
Definition: actor.cpp:17
auto get_current_node() -> Node &
Definition: process.cpp:218
auto exit(const Reason exit_reason) -> bool
Definition: process.cpp:105
static ResultUnion Ok
Definition: process.h:31
std::unordered_map< ProcessFlag, bool, ProcessFlagHashFunc > ProcessFlags
Definition: process.h:62
ProcessDictionary dictionary
Definition: process.h:118
std::experimental::optional< Pid > MaybePid
Definition: pid.h:20
Mailbox mailbox
Definition: process.h:110
static ResultUnion Unhandled
Definition: process.h:33
Process(const Pid &_pid, const Behaviour &&_behaviour, const ProcessExecutionConfig &execution_config=get_default_execution_config(), const MaybePid &initial_link_pid=std::experimental::nullopt, const ProcessDictionary::AncestorList &&_ancestors={}, Node *const _current_node=nullptr)
Definition: process.cpp:36
const Pid pid
Definition: process.h:108
Process::Reason Reason
Definition: actor_model.cpp:17
static auto get_default_execution_config() -> const ProcessExecutionConfig &
Definition: process.cpp:230
auto unlink(const Pid &pid2) -> bool
Definition: process.cpp:175
ProcessFlags process_flags
Definition: process.h:119
AncestorList ancestors
Definition: process.h:68
LinkList links
Definition: process.h:114
auto process_flag(const ProcessFlag flag, const bool flag_setting) -> bool
Definition: process.cpp:199
Behaviour behaviour
Definition: process.h:111
Definition: actor_model.fbs:27
std::string string
Definition: oom_killer_actor_behaviour.cpp:24
std::unordered_set< Pid, UUID::UUIDHashFunc, UUID::UUIDEqualFunc > LinkList
Definition: process.h:44
std::experimental::string_view string_view
Definition: actor_model.cpp:16
ProcessFlag
Definition: actor_model.fbs:22
auto operator()(const ProcessFlag &flag) const -> size_t
Definition: process.h:51
UUID::UUID Pid
Definition: pid.h:19
Definition: node.h:69
std::unordered_set< Pid, UUID::UUIDHashFunc, UUID::UUIDEqualFunc > MonitorList
Definition: process.h:45
Definition: process.h:38
SemaphoreHandle_t receive_semaphore
Definition: process.h:122
std::vector< Pid > AncestorList
Definition: process.h:66
virtual ~Process()
Definition: process.cpp:86
delegate< ResultUnion(const Pid &, Mailbox &)> Behaviour
Definition: behaviour.h:80
Node *const current_node
Definition: process.h:124
auto link(const Pid &pid2) -> bool
Definition: process.cpp:151
auto _execute() -> ResultUnion
Definition: process.cpp:249