#pragma once #include #include #include #include #include namespace mbgl { class Scheduler; class Message; class Mailbox : public std::enable_shared_from_this { public: /// Create a "holding" mailbox, messages to which will remain queued, /// unconsumed, until the mailbox is associated with a Scheduler using /// start(). This allows a Mailbox object to be created on one thread and /// later transferred to a different target thread that may not yet exist. Mailbox(); Mailbox(Scheduler&); /// Attach the given scheduler to this mailbox and begin processing messages /// sent to it. The mailbox must be a "holding" mailbox, as created by the /// default constructor Mailbox(). void open(Scheduler& scheduler_); void close(); bool isOpen() const; void push(std::unique_ptr); void receive(); static void maybeReceive(const std::weak_ptr&); static std::function makeClosure(std::weak_ptr); private: mapbox::base::WeakPtr weakScheduler; std::recursive_mutex receivingMutex; std::mutex pushingMutex; bool closed{false}; std::mutex queueMutex; std::queue> queue; }; } // namespace mbgl