| Index: content/browser/memory/memory_coordinator_impl.h
|
| diff --git a/content/browser/memory/memory_coordinator_impl.h b/content/browser/memory/memory_coordinator_impl.h
|
| index 95c2a2c2004637ecaeda20d10b66c73cc68663bf..014bb5280245d41d88032e40b29e5aacc5c099a4 100644
|
| --- a/content/browser/memory/memory_coordinator_impl.h
|
| +++ b/content/browser/memory/memory_coordinator_impl.h
|
| @@ -7,7 +7,6 @@
|
|
|
| #include "base/callback.h"
|
| #include "base/memory/singleton.h"
|
| -#include "base/memory/weak_ptr.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/threading/non_thread_safe.h"
|
| #include "base/time/time.h"
|
| @@ -19,40 +18,32 @@ namespace content {
|
|
|
| class MemoryMonitor;
|
| class MemoryCoordinatorImplTest;
|
| +class MemoryStateUpdater;
|
| struct MemoryCoordinatorSingletonTraits;
|
|
|
| -// MemoryCoordinatorImpl is an internal implementation of MemoryCoordinator
|
| -// which uses a heuristic to determine a single global memory state.
|
| -// In the current implementation browser process and renderer processes share
|
| -// the global state; the memory coordinator will notify the global state to
|
| -// all background renderers if the state has changed.
|
| -//
|
| -// State calculation:
|
| -// MemoryCoordinatorImpl uses followings to determine the global state:
|
| -// * Compute "number of renderers which can be created until the system will
|
| -// be in a critical state". Call this N.
|
| -// (See memory_monitor.h for the definition of "critical")
|
| -// * Covert N to a memory state using some thresholds/hysteresis for each state.
|
| -// Once a state is changed to a limited state, larger N will be needed to go
|
| -// back to a relaxed state. (e.g. THROTTLED -> NORMAL)
|
| -// * Once a state is changed, it remains the same for a certain period of time.
|
| +// MemoryCoordinatorImpl is an implementation of MemoryCoordinator.
|
| +// The current implementation uses MemoryStateUpdater to update the global
|
| +// memory state. See comments in MemoryStateUpdater for details.
|
| class CONTENT_EXPORT MemoryCoordinatorImpl : public MemoryCoordinator,
|
| public NotificationObserver,
|
| public base::NonThreadSafe {
|
| public:
|
| + using MemoryState = base::MemoryState;
|
| +
|
| MemoryCoordinatorImpl(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
|
| std::unique_ptr<MemoryMonitor> monitor);
|
| ~MemoryCoordinatorImpl() override;
|
|
|
| + MemoryMonitor* memory_monitor() { return memory_monitor_.get(); }
|
| + MemoryStateUpdater* state_updater() { return state_updater_.get(); }
|
| +
|
| // MemoryCoordinator implementations:
|
| void Start() override;
|
| void OnChildAdded(int render_process_id) override;
|
|
|
| - MemoryMonitor* memory_monitor() { return memory_monitor_.get(); }
|
| -
|
| - base::MemoryState GetGlobalMemoryState() const override;
|
| - base::MemoryState GetCurrentMemoryState() const override;
|
| - void SetCurrentMemoryStateForTesting(base::MemoryState memory_state) override;
|
| + MemoryState GetGlobalMemoryState() const override;
|
| + MemoryState GetCurrentMemoryState() const override;
|
| + void SetCurrentMemoryStateForTesting(MemoryState memory_state) override;
|
|
|
| // NotificationObserver implementation:
|
| void Observe(int type,
|
| @@ -65,6 +56,11 @@ class CONTENT_EXPORT MemoryCoordinatorImpl : public MemoryCoordinator,
|
| void ForceSetGlobalState(base::MemoryState new_state,
|
| base::TimeDelta duration);
|
|
|
| + // Changes the global state and notifies state changes to clients (lives in
|
| + // the browser) and child processes (renderers) if needed. Returns true when
|
| + // the state is actually changed.
|
| + bool ChangeStateIfNeeded(MemoryState prev_state, MemoryState next_state);
|
| +
|
| private:
|
| FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, CalculateNextState);
|
| FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, UpdateState);
|
| @@ -73,20 +69,6 @@ class CONTENT_EXPORT MemoryCoordinatorImpl : public MemoryCoordinator,
|
|
|
| friend struct MemoryCoordinatorSingletonTraits;
|
|
|
| - using MemoryState = base::MemoryState;
|
| -
|
| - // Changes the global state and notifies state changes to clients (lives in
|
| - // the browser) and child processes (renderers) if needed. Returns true when
|
| - // the state is actually changed.
|
| - bool ChangeStateIfNeeded(MemoryState prev_state, MemoryState next_state);
|
| -
|
| - // Calculates the next global state from the amount of free memory using
|
| - // a heuristic.
|
| - MemoryState CalculateNextState();
|
| -
|
| - // Periodically called to update the global state.
|
| - void UpdateState();
|
| -
|
| // Notifies a state change to in-process clients.
|
| void NotifyStateToClients();
|
|
|
| @@ -98,52 +80,12 @@ class CONTENT_EXPORT MemoryCoordinatorImpl : public MemoryCoordinator,
|
| MemoryState next_state,
|
| base::TimeDelta duration);
|
|
|
| - // Schedules a task to update the global state. The task will be executed
|
| - // after |delay| has passed.
|
| - void ScheduleUpdateState(base::TimeDelta delay);
|
| -
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| - NotificationRegistrar notification_registrar_;
|
| std::unique_ptr<MemoryMonitor> memory_monitor_;
|
| - base::CancelableClosure update_state_closure_;
|
| - base::MemoryState current_state_ = MemoryState::NORMAL;
|
| + NotificationRegistrar notification_registrar_;
|
| + std::unique_ptr<MemoryStateUpdater> state_updater_;
|
| + MemoryState current_state_ = MemoryState::NORMAL;
|
| base::TimeTicks last_state_change_;
|
|
|
| - // Sets up parameters for the heuristic.
|
| - void InitializeParameters();
|
| -
|
| - // Validates parameters defined below.
|
| - bool ValidateParameters();
|
| -
|
| - // Parameters to control the heuristic.
|
| -
|
| - // The median size of a renderer on the current platform. This is used to
|
| - // convert the amount of free memory to an expected number of new renderers
|
| - // that could be started before hitting critical memory pressure.
|
| - int expected_renderer_size_;
|
| - // When in a NORMAL state and the potential number of new renderers drops
|
| - // below this level, the coordinator will transition to a THROTTLED state.
|
| - int new_renderers_until_throttled_;
|
| - // When in a NORMAL/THROTTLED state and the potential number of new renderers
|
| - // drops below this level, the coordinator will transition to a SUSPENDED
|
| - // state.
|
| - int new_renderers_until_suspended_;
|
| - // When in a THROTTLED/SUSPENDED state and the potential number of new
|
| - // renderers rises above this level, the coordinator will transition to a
|
| - // NORMAL state.
|
| - int new_renderers_back_to_normal_;
|
| - // When in a SUSPENDED state and the potential number of new renderers rises
|
| - // above this level, the coordinator will transition to a SUSPENDED state.
|
| - int new_renderers_back_to_throttled_;
|
| - // The memory coordinator stays in the same state at least this duration even
|
| - // when there are considerable changes in the amount of free memory to prevent
|
| - // thrashing.
|
| - base::TimeDelta minimum_transition_period_;
|
| - // The interval of checking the amount of free memory.
|
| - base::TimeDelta monitoring_interval_;
|
| -
|
| - base::WeakPtrFactory<MemoryCoordinatorImpl> weak_ptr_factory_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(MemoryCoordinatorImpl);
|
| };
|
|
|
|
|