Chromium Code Reviews| 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 4374cfc75e737013fef3b39a99ee7f55f304fbcb..b92d83c28c6074680f8f63aad1e8bc4d3ec963b4 100644 |
| --- a/content/browser/memory/memory_coordinator_impl.h |
| +++ b/content/browser/memory/memory_coordinator_impl.h |
| @@ -24,16 +24,23 @@ namespace content { |
| // NOTE: Memory coordinator is under development and not fully working. |
| +class MemoryConditionObserver; |
| class MemoryCoordinatorHandleImpl; |
| class MemoryCoordinatorImplTest; |
| class MemoryMonitor; |
| -class MemoryStateUpdater; |
| class RenderProcessHost; |
| struct MemoryCoordinatorSingletonTraits; |
| +// MemoryCondition is an internal state of memory coordinator which is used for |
| +// various things; calculating memory state for processes, requesting processes |
| +// to purge memory, and scheduling tab discarding. |
| +enum class MemoryCondition : int { |
| + NORMAL = 0, |
| + WARNING = 1, |
| + CRITICAL = 2, |
| +}; |
| + |
| // 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 base::MemoryCoordinator, |
| public MemoryCoordinator, |
| public NotificationObserver, |
| @@ -71,18 +78,13 @@ class CONTENT_EXPORT MemoryCoordinatorImpl : public base::MemoryCoordinator, |
| void RecordMemoryPressure( |
| base::MemoryPressureMonitor::MemoryPressureLevel level); |
| - // Returns the global memory state. |
| - virtual MemoryState GetGlobalMemoryState() const; |
| - |
| - // Returns the browser's current memory state. Note that the current state |
| - // could be different from the global memory state as the browser won't be |
| - // suspended. |
| + // Returns the browser's current memory state. |
| MemoryState GetCurrentMemoryState() const override; |
| - // Sets the global memory state for testing. |
| + // Temporariy sets memory state of the browser process for testing. |
|
haraken
2017/02/28 11:33:45
Temporarily
bashi
2017/03/02 04:01:45
Done.
|
| void SetCurrentMemoryStateForTesting(MemoryState memory_state) override; |
| - // MemoryCoordinator implementation: |
| + // content::MemoryCoordinator implementation: |
| MemoryState GetStateForProcess(base::ProcessHandle handle) override; |
| // NotificationObserver implementation: |
| @@ -90,16 +92,19 @@ class CONTENT_EXPORT MemoryCoordinatorImpl : public base::MemoryCoordinator, |
| const NotificationSource& source, |
| const NotificationDetails& details) override; |
| - // Overrides the global state to |new_state|. State update tasks won't be |
| - // scheduled until |duration| is passed. This means that the global state |
| - // remains the same until |duration| is passed or another call of this method. |
| - void ForceSetGlobalState(base::MemoryState new_state, |
| - base::TimeDelta duration); |
| + // Returns the current memory condition. |
| + MemoryCondition GetMemoryCondition() const { return memory_condition_; } |
| - // 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); |
| + // Overrides the current memory condition to |condition|. Memory condition |
| + // update tasks won't be scheduled until |duration| is passed. This means that |
| + // the memory condition remains the same until |duration| is passed or |
| + // another call of this method. |
| + void ForceSetMemoryCondition(MemoryCondition condition, |
| + base::TimeDelta duration); |
| + |
| + // Changes current memory condition if needed. This may trigger some actions |
| + // like purging memory and memory state changes. |
| + void UpdateConditionIfNeeded(MemoryCondition condition); |
| // Asks the delegate to discard a tab. |
| void DiscardTab(); |
| @@ -153,21 +158,23 @@ class CONTENT_EXPORT MemoryCoordinatorImpl : public base::MemoryCoordinator, |
| FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorWithServiceWorkerTest, |
| CannotSuspendRendererWithServiceWorker); |
| #endif |
| - FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, CalculateNextState); |
| - FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, UpdateState); |
| + FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, CalculateNextCondition); |
| + FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, UpdateCondition); |
| FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, SetMemoryStateForTesting); |
| - FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, ForceSetGlobalState); |
| + FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, ForceSetMemoryCondition); |
| friend struct MemoryCoordinatorSingletonTraits; |
| friend class MemoryCoordinatorHandleImpl; |
| + // Updates the browser's memory state if needed. |
| + void UpdateCurrentMemoryState(MemoryState state); |
| + |
| // Called when ChildMemoryCoordinator calls AddChild(). |
| void OnChildAdded(int render_process_id); |
| // Called by SetChildMemoryState() to determine a child memory state based on |
| // the current status of the child process. |
| - MemoryState OverrideGlobalState(MemoryState memroy_state, |
| - const ChildInfo& child); |
| + MemoryState OverrideState(MemoryState memroy_state, const ChildInfo& child); |
| // Helper function of CreateHandle and AddChildForTesting. |
| void CreateChildInfoMapEntry( |
| @@ -175,19 +182,29 @@ class CONTENT_EXPORT MemoryCoordinatorImpl : public base::MemoryCoordinator, |
| std::unique_ptr<MemoryCoordinatorHandleImpl> handle); |
| // Notifies a state change to in-process clients. |
| - void NotifyStateToClients(); |
| + void NotifyStateToClients(MemoryState state); |
| // Notifies a state change to child processes. |
| - void NotifyStateToChildren(); |
| + void NotifyStateToChildren(MemoryState state); |
| std::unique_ptr<MemoryCoordinatorDelegate> delegate_; |
| std::unique_ptr<MemoryMonitor> memory_monitor_; |
| - std::unique_ptr<MemoryStateUpdater> state_updater_; |
| + std::unique_ptr<MemoryConditionObserver> condition_observer_; |
| NotificationRegistrar notification_registrar_; |
| - // The global memory state. |
| + |
| + // The current memory condition. |
| + MemoryCondition memory_condition_ = MemoryCondition::NORMAL; |
| + |
| + // The memory state of the browser process. |
| MemoryState current_state_ = MemoryState::NORMAL; |
|
haraken
2017/02/28 11:33:45
current_state_ => browser_memory_state_ ?
bashi
2017/03/02 04:01:45
Yes. Done.
|
| - // The time tick of last global state change. |
| + |
| + // The time tick of last state change of the browser process. |
| base::TimeTicks last_state_change_; |
| + |
| + // Memory state for a process will remain unchanged until this period of time |
| + // passes. |
| + base::TimeDelta minimum_state_transition_period_; |
| + |
| // Tracks child processes. An entry is added when a renderer connects to |
| // MemoryCoordinator and removed automatically when an underlying binding is |
| // disconnected. |