#pragma once #include namespace mbgl { class Mailbox; /* A `Scheduler` is responsible for coordinating the processing of messages by one or more actors via their mailboxes. It's an abstract interface. Currently, the following concrete implementations exist: * `ThreadPool` can coordinate an unlimited number of actors over any number of threads via a pool, preserving the following behaviors: - Messages from each individual mailbox are processed in order - Only a single message from a mailbox is processed at a time; there is no concurrency within a mailbox Subject to these constraints, processing can happen on whatever thread in the pool is available. * `Scheduler::GetCurrent()` is typically used to create a mailbox and `ActorRef` for an object that lives on the main thread and is not itself wrapped an `Actor`. The underlying implementation of this Scheduler should usually be a `RunLoop` auto mailbox = std::make_shared(*Scheduler::Get()); Actor worker(threadPool, ActorRef(*this, mailbox)); */ class Scheduler { public: virtual ~Scheduler() = default; virtual void schedule(std::weak_ptr) = 0; // Set/Get the current Scheduler for this thread static Scheduler* GetCurrent(); static void SetCurrent(Scheduler*); }; } // namespace mbgl