MakerLabs ACM
mailbox.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 "received_message.h"
15 #include "uuid.h"
16 
17 #include "actor_model_generated.h"
18 
19 #include <experimental/string_view>
20 #include <string>
21 #include <unordered_map>
22 
23 #include "freertos/FreeRTOS.h"
24 #include "freertos/ringbuf.h"
25 #include "freertos/semphr.h"
26 
27 namespace ActorModel {
28 
29 class ReceivedMessage;
30 
31 class Mailbox
32 {
33  friend class ReceivedMessage;
34 public:
35  using string = std::string;
37 
38  using ReceivedMessagePtr = std::unique_ptr<ReceivedMessage>;
39 
41 
42  using AddressRegistry = std::unordered_map<
43  Address,
44  Mailbox*,
47  >;
48 
49  explicit Mailbox(
50  const size_t _mailbox_size = 2048,
51  const size_t _send_timeout_microseconds = 0,
52  const size_t _receive_timeout_microseconds = 0,
53  const size_t _receive_lock_timeout_microseconds = 0
54  );
55  ~Mailbox();
56 
57  static auto create_message(
58  const string_view type,
59  const string_view payload,
60  const size_t payload_alignment = sizeof(uint64_t),
61  const Pid* from_pid = nullptr
62  ) -> flatbuffers::DetachedBuffer;
63 
64  auto send(const Message& message)
65  -> bool;
66 
67  auto send(
68  const string_view type,
69  const string_view payload,
70  const size_t payload_alignment = sizeof(uint64_t),
71  const Pid* from_pid = nullptr
72  ) -> bool;
73 
74  auto receive(bool verify = false)
76 
78 
79 private:
80  size_t mailbox_size;
81  size_t send_timeout_ticks;
82  size_t receive_timeout_ticks;
83  size_t receive_lock_timeout_ticks;
84  RingbufHandle_t impl;
85  SemaphoreHandle_t receive_semaphore = nullptr;
86  portMUX_TYPE receive_multicore_mutex;
87 
88 protected:
89  auto release(const string_view message)
90  -> bool;
91 
92 private:
93  auto receive_raw()
94  -> string_view;
95 
96 //static methods:
97  static auto send(const Address& address, const Message& message)
98  -> bool;
99 
100  static auto send(
101  const Address& address,
102  const string_view type,
103  const string_view payload
104  ) -> bool;
105 
106  static AddressRegistry address_registry;
107 };
108 
109 } // namespace ActorModel
Definition: mailbox.h:31
Definition: uuid.h:28
Definition: actor.cpp:17
auto send(const Message &message) -> bool
Definition: mailbox.cpp:131
Definition: actor_model.fbs:27
std::string string
Definition: oom_killer_actor_behaviour.cpp:24
std::experimental::string_view string_view
Definition: actor_model.cpp:16
~Mailbox()
Definition: mailbox.cpp:56
UUID::UUID Address
Definition: mailbox.h:40
UUID::UUID Pid
Definition: pid.h:19
auto release(const string_view message) -> bool
Definition: mailbox.cpp:245
auto receive(bool verify=false) -> ReceivedMessagePtr
Definition: mailbox.cpp:187
Mailbox(const size_t _mailbox_size=2048, const size_t _send_timeout_microseconds=0, const size_t _receive_timeout_microseconds=0, const size_t _receive_lock_timeout_microseconds=0)
Definition: mailbox.cpp:29
Definition: received_message.h:21
const Address address
Definition: mailbox.h:77
Definition: uuid.h:22
static auto create_message(const string_view type, const string_view payload, const size_t payload_alignment=sizeof(uint64_t), const Pid *from_pid=nullptr) -> flatbuffers::DetachedBuffer
Definition: mailbox.cpp:81
std::unordered_map< Address, Mailbox *, UUID::UUIDHashFunc, UUID::UUIDEqualFunc > AddressRegistry
Definition: mailbox.h:47
std::unique_ptr< ReceivedMessage > ReceivedMessagePtr
Definition: mailbox.h:38
UUID::UUID UUID
Definition: firmware_update_actor.cpp:41
std::experimental::string_view string_view
Definition: mailbox.h:36