Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1418)

Unified Diff: chrome/browser/lifetime/keep_alive_registry.cc

Issue 1725883002: Add KeepAliveStateObserver, add the Restart option (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@KeepAlive
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/lifetime/keep_alive_registry.cc
diff --git a/chrome/browser/lifetime/keep_alive_registry.cc b/chrome/browser/lifetime/keep_alive_registry.cc
index 72628b32fe6c0e6759023bd957c3ae0c87e933df..7f540f6c46d67f75d82f3e3ed0355916883d06a3 100644
--- a/chrome/browser/lifetime/keep_alive_registry.cc
+++ b/chrome/browser/lifetime/keep_alive_registry.cc
@@ -4,7 +4,9 @@
#include "chrome/browser/lifetime/keep_alive_registry.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/browser/lifetime/keep_alive_state_observer.h"
#include "chrome/browser/lifetime/keep_alive_types.h"
namespace {
@@ -17,6 +19,18 @@ void RemoveOne(keep_alive::Origin key,
container.erase(it);
}
+void HugBrowser() {
Bernhard Bauer 2016/02/24 16:54:34 Awww... 😃
dgn 2016/02/26 14:34:29 Aaaand.. It's gone.
+ // TODO(dgn): We currently use the plain KeepAliveCount. We will integrate
+ // that in this class progressively as mechanisms are merged.
+ chrome::IncrementKeepAliveCount();
+}
+
+void ReleaseBrowser() {
+ // TODO(dgn): We currently use the plain KeepAliveCount. We will integrate
+ // that in this class progressively as mechanisms are merged.
+ chrome::DecrementKeepAliveCount();
+}
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -27,29 +41,96 @@ KeepAliveRegistry* KeepAliveRegistry::GetInstance() {
return base::Singleton<KeepAliveRegistry>::get();
}
+void KeepAliveRegistry::AddObserver(KeepAliveStateObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void KeepAliveRegistry::RemoveObserver(KeepAliveStateObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
+
////////////////////////////////////////////////////////////////////////////////
// Private methods
-KeepAliveRegistry::KeepAliveRegistry() {}
+KeepAliveRegistry::KeepAliveRegistry() {
+ state_ = {false, // is_keeping_alive
+ keep_alive::RestartOption::DISABLED};
+}
KeepAliveRegistry::~KeepAliveRegistry() {
DCHECK_EQ(0u, registered_keep_alives_.size());
+ DCHECK_EQ(0u, restart_allowed_keep_alives_.size());
}
-void KeepAliveRegistry::Register(keep_alive::Origin origin) {
+KeepAliveRegistry::KeepAliveState KeepAliveRegistry::ComputeCurrentState()
+ const {
+ bool keeping_alive = registered_keep_alives_.size() > 0;
+ bool restart_allowed =
+ registered_keep_alives_.size() == restart_allowed_keep_alives_.size() &&
+ keeping_alive;
Bernhard Bauer 2016/02/24 16:54:33 Hm... is restart really disallowed if nothing is k
dgn 2016/02/24 19:08:32 Hum true... The observer can always check WillKeep
+
+ return {keeping_alive, restart_allowed ? keep_alive::RestartOption::ENABLED
+ : keep_alive::RestartOption::DISABLED};
+}
+
+void KeepAliveRegistry::NotifyOfStateDifferences(
+ const KeepAliveState& new_state) {
+ if (state_.restart != new_state.restart) {
+ if (new_state.restart == keep_alive::RestartOption::ENABLED) {
+ VLOG(1) << "Notifying observers: Restart Allowed";
+ FOR_EACH_OBSERVER(KeepAliveStateObserver, observers_, OnRestartAllowed());
+ } else {
+ VLOG(1) << "Notifying observers: Restart Forbidden";
+ FOR_EACH_OBSERVER(KeepAliveStateObserver, observers_,
+ OnRestartForbidden());
+ }
+ }
+}
+
+void KeepAliveRegistry::Register(keep_alive::Origin origin,
+ keep_alive::RestartOption restart) {
registered_keep_alives_.insert(origin);
+ if (restart == keep_alive::RestartOption::ENABLED) {
Bernhard Bauer 2016/02/24 16:54:34 Nit: No braces.
dgn 2016/02/26 14:34:29 Removed.
+ restart_allowed_keep_alives_.insert(origin);
+ }
- // TODO(dgn): We currently use the plain KeepAliveCount. We will integrate
- // that in this class progressively as mechanisms are merged.
- if (registered_keep_alives_.size() == 1)
- chrome::IncrementKeepAliveCount();
+ if (!state_.is_keeping_alive)
+ HugBrowser();
+
+ KeepAliveState new_state = ComputeCurrentState();
+ NotifyOfStateDifferences(new_state);
+ state_ = new_state;
+ DumpRegistryIfDebug();
}
-void KeepAliveRegistry::Unregister(keep_alive::Origin origin) {
+void KeepAliveRegistry::Unregister(keep_alive::Origin origin,
+ keep_alive::RestartOption restart) {
RemoveOne(origin, registered_keep_alives_);
+ if (restart == keep_alive::RestartOption::ENABLED) {
Bernhard Bauer 2016/02/24 16:54:34 Nit: Braces are unnecessary here.
dgn 2016/02/26 14:34:29 Removed.
+ RemoveOne(origin, restart_allowed_keep_alives_);
+ }
- // TODO(dgn): We currently use the plain KeepAliveCount. We will integrate
- // that in this class progressively as mechanisms are merged.
- if (registered_keep_alives_.size() == 0)
- chrome::DecrementKeepAliveCount();
+ KeepAliveState new_state = ComputeCurrentState();
+ NotifyOfStateDifferences(new_state);
+ state_ = new_state;
+ DumpRegistryIfDebug();
+
+ if (!state_.is_keeping_alive)
+ ReleaseBrowser();
+}
+
+void KeepAliveRegistry::DumpRegistryIfDebug() const {
+#ifndef NDEBUG
+ VLOG(1) << "KeepAliveRegistry dump - total: {registered="
+ << registered_keep_alives_.size()
+ << ", restart=" << restart_allowed_keep_alives_.size() << "}";
+ for (auto origin_it = registered_keep_alives_.begin();
+ origin_it != registered_keep_alives_.end();
+ origin_it = registered_keep_alives_.upper_bound(*origin_it)) {
+ VLOG(1) << "- " << *origin_it
+ << " {registered=" << registered_keep_alives_.count(*origin_it)
+ << ", restart=" << restart_allowed_keep_alives_.count(*origin_it)
+ << "}";
+ }
+#endif // ndef NDEBUG
}

Powered by Google App Engine
This is Rietveld 408576698