#include #include #include #include namespace mbgl { Mailbox::Mailbox(Scheduler& scheduler_) : scheduler(scheduler_) { } void Mailbox::push(std::unique_ptr message) { assert(!closing); std::lock_guard queueLock(queueMutex); bool wasEmpty = queue.empty(); queue.push(std::move(message)); if (wasEmpty) { scheduler.schedule(shared_from_this()); } } void Mailbox::close() { // Block until the scheduler is guaranteed not to be executing receive(). std::lock_guard closingLock(closingMutex); closing = true; } void Mailbox::receive() { std::lock_guard closingLock(closingMutex); if (closing) { return; } std::unique_ptr message; bool wasEmpty; { std::lock_guard queueLock(queueMutex); assert(!queue.empty()); message = std::move(queue.front()); queue.pop(); wasEmpty = queue.empty(); } (*message)(); if (!wasEmpty) { scheduler.schedule(shared_from_this()); } } void Mailbox::maybeReceive(std::weak_ptr mailbox) { if (auto locked = mailbox.lock()) { locked->receive(); } } } // namespace mbgl