MapLibre Native Core
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
mailbox.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <functional>
4 #include <memory>
5 #include <mutex>
6 #include <queue>
7 
8 #include <mapbox/std/weak.hpp>
9 
10 namespace mbgl {
11 
12 class Scheduler;
13 class Message;
14 
15 class Mailbox : public std::enable_shared_from_this<Mailbox> {
16 public:
17 
23 
25 
29  void open(Scheduler& scheduler_);
30  void close();
31 
32  bool isOpen() const;
33 
34  void push(std::unique_ptr<Message>);
35  void receive();
36 
37  static void maybeReceive(const std::weak_ptr<Mailbox>&);
38  static std::function<void()> makeClosure(std::weak_ptr<Mailbox>);
39 
40 private:
41  mapbox::base::WeakPtr<Scheduler> weakScheduler;
42 
43  std::recursive_mutex receivingMutex;
44  std::mutex pushingMutex;
45 
46  bool closed { false };
47 
48  std::mutex queueMutex;
49  std::queue<std::unique_ptr<Message>> queue;
50 };
51 
52 } // namespace mbgl
static std::function< void()> makeClosure(std::weak_ptr< Mailbox >)
Mailbox(Scheduler &)
bool isOpen() const
void open(Scheduler &scheduler_)
void push(std::unique_ptr< Message >)
static void maybeReceive(const std::weak_ptr< Mailbox > &)
Definition: actor.hpp:15