From bf243a33e8414460c288befc8fc3626fd8c04594 Mon Sep 17 00:00:00 2001 From: Simon Fels Date: Fri, 12 May 2017 08:35:10 +0200 Subject: [PATCH] Make platform policy a weak_ptr inside our window managers to break cycle reference --- src/anbox/wm/multi_window_manager.cpp | 15 +++++++++++---- src/anbox/wm/multi_window_manager.h | 4 ++-- src/anbox/wm/single_window_manager.cpp | 12 ++++++++---- src/anbox/wm/single_window_manager.h | 4 ++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/anbox/wm/multi_window_manager.cpp b/src/anbox/wm/multi_window_manager.cpp index 83ab0b6..04806f3 100644 --- a/src/anbox/wm/multi_window_manager.cpp +++ b/src/anbox/wm/multi_window_manager.cpp @@ -25,7 +25,7 @@ namespace anbox { namespace wm { -MultiWindowManager::MultiWindowManager(const std::shared_ptr &policy, +MultiWindowManager::MultiWindowManager(const std::weak_ptr &policy, const std::shared_ptr &android_api_stub, const std::shared_ptr &app_db) : platform_policy_(policy), android_api_stub_(android_api_stub), app_db_(app_db) {} @@ -67,9 +67,16 @@ void MultiWindowManager::apply_window_state_update(const WindowState::List &upda if (app.valid()) title = app.name; - auto platform_window = platform_policy_->create_window(window.task(), window.frame(), title); - platform_window->attach(); - windows_.insert({window.task(), platform_window}); + if (auto p = platform_policy_.lock()) { + auto w = p->create_window(window.task(), window.frame(), title); + if (w) { + w->attach(); + windows_.insert({window.task(), w}); + } else { + // FIXME can we call this here safely or do we need to schedule the removal? + remove_task(window.task()); + } + } } // Send updates we collected per task down to the corresponding window diff --git a/src/anbox/wm/multi_window_manager.h b/src/anbox/wm/multi_window_manager.h index 4e2d7c4..845986c 100644 --- a/src/anbox/wm/multi_window_manager.h +++ b/src/anbox/wm/multi_window_manager.h @@ -37,7 +37,7 @@ class Policy; namespace wm { class MultiWindowManager : public Manager { public: - MultiWindowManager(const std::shared_ptr &policy, + MultiWindowManager(const std::weak_ptr &policy, const std::shared_ptr &android_api_stub, const std::shared_ptr &app_db); ~MultiWindowManager(); @@ -53,7 +53,7 @@ class MultiWindowManager : public Manager { private: std::mutex mutex_; - std::shared_ptr platform_policy_; + std::weak_ptr platform_policy_; std::shared_ptr android_api_stub_; std::shared_ptr app_db_; std::map> windows_; diff --git a/src/anbox/wm/single_window_manager.cpp b/src/anbox/wm/single_window_manager.cpp index 6adb43e..10dd8f9 100644 --- a/src/anbox/wm/single_window_manager.cpp +++ b/src/anbox/wm/single_window_manager.cpp @@ -26,7 +26,7 @@ namespace anbox { namespace wm { -SingleWindowManager::SingleWindowManager(const std::shared_ptr &policy, +SingleWindowManager::SingleWindowManager(const std::weak_ptr &policy, const graphics::Rect &window_size, const std::shared_ptr &app_db) : platform_policy_(policy), window_size_(window_size), app_db_(app_db) {} @@ -34,9 +34,13 @@ SingleWindowManager::SingleWindowManager(const std::shared_ptr SingleWindowManager::~SingleWindowManager() {} void SingleWindowManager::setup() { - window_ = platform_policy_->create_window(0, window_size_, "Anbox - Android in a Box"); - if (!window_->attach()) - WARNING("Failed to attach window to renderer"); + if (auto p = platform_policy_.lock()) { + window_ = p->create_window(0, window_size_, "Anbox - Android in a Box"); + if (!window_->attach()) + WARNING("Failed to attach window to renderer"); + } else { + throw std::runtime_error("Can't create window as we don't have a platform abstraction"); + } } void SingleWindowManager::apply_window_state_update(const WindowState::List &updated, const WindowState::List &removed) { diff --git a/src/anbox/wm/single_window_manager.h b/src/anbox/wm/single_window_manager.h index 6d0d2ca..7595776 100644 --- a/src/anbox/wm/single_window_manager.h +++ b/src/anbox/wm/single_window_manager.h @@ -35,7 +35,7 @@ namespace wm { class Window; class SingleWindowManager : public Manager { public: - SingleWindowManager(const std::shared_ptr &policy, + SingleWindowManager(const std::weak_ptr &policy, const graphics::Rect &window_size, const std::shared_ptr &app_db); ~SingleWindowManager(); @@ -52,7 +52,7 @@ class SingleWindowManager : public Manager { void remove_task(const Task::Id &task) override; private: - std::shared_ptr platform_policy_; + std::weak_ptr platform_policy_; graphics::Rect window_size_; std::shared_ptr app_db_; std::shared_ptr window_;