From cd966c2ba6c3b3dbecd5c81627aa5a4ca59a40c9 Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Thu, 23 Apr 2020 16:04:37 +0300 Subject: Backport '[core] Use weak scheduler inside mailbox' Backport: 40d42f339216e21e04b0ad2509de2fb4f6483103 --- include/mbgl/actor/mailbox.hpp | 4 ++-- src/mbgl/actor/mailbox.cpp | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/include/mbgl/actor/mailbox.hpp b/include/mbgl/actor/mailbox.hpp index 23c579917a..d2510e9270 100644 --- a/include/mbgl/actor/mailbox.hpp +++ b/include/mbgl/actor/mailbox.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -36,7 +36,7 @@ public: static void maybeReceive(std::weak_ptr); private: - optional scheduler; + mapbox::base::WeakPtr weakScheduler; std::recursive_mutex receivingMutex; std::mutex pushingMutex; diff --git a/src/mbgl/actor/mailbox.cpp b/src/mbgl/actor/mailbox.cpp index 8ee8dca114..e4e59efd77 100644 --- a/src/mbgl/actor/mailbox.cpp +++ b/src/mbgl/actor/mailbox.cpp @@ -9,26 +9,25 @@ namespace mbgl { Mailbox::Mailbox() { } -Mailbox::Mailbox(Scheduler& scheduler_) - : scheduler(&scheduler_) { -} +Mailbox::Mailbox(Scheduler& scheduler_) : weakScheduler(scheduler_.makeWeakPtr()) {} void Mailbox::open(Scheduler& scheduler_) { - assert(!scheduler); + assert(!weakScheduler); // As with close(), block until neither receive() nor push() are in progress, and acquire the two // mutexes in the same order. std::lock_guard receivingLock(receivingMutex); std::lock_guard pushingLock(pushingMutex); - scheduler = &scheduler_; + weakScheduler = scheduler_.makeWeakPtr(); if (closed) { return; } if (!queue.empty()) { - (*scheduler)->schedule(shared_from_this()); + auto guard = weakScheduler.lock(); + if (weakScheduler) weakScheduler->schedule(shared_from_this()); } } @@ -44,8 +43,9 @@ void Mailbox::close() { closed = true; } -bool Mailbox::isOpen() const { return bool(scheduler); } - +bool Mailbox::isOpen() const { + return bool(weakScheduler); +} void Mailbox::push(std::unique_ptr message) { std::lock_guard pushingLock(pushingMutex); @@ -57,15 +57,17 @@ void Mailbox::push(std::unique_ptr message) { std::lock_guard queueLock(queueMutex); bool wasEmpty = queue.empty(); queue.push(std::move(message)); - if (wasEmpty && scheduler) { - (*scheduler)->schedule(shared_from_this()); + auto guard = weakScheduler.lock(); + if (wasEmpty && weakScheduler) { + weakScheduler->schedule(shared_from_this()); } } void Mailbox::receive() { std::lock_guard receivingLock(receivingMutex); - - assert(scheduler); + + auto guard = weakScheduler.lock(); + assert(weakScheduler); if (closed) { return; @@ -85,7 +87,7 @@ void Mailbox::receive() { (*message)(); if (!wasEmpty) { - (*scheduler)->schedule(shared_from_this()); + weakScheduler->schedule(shared_from_this()); } } -- cgit v1.2.1