| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/memory/tab_manager_delegate_chromeos.h" | 5 #include "chrome/browser/memory/tab_manager_delegate_chromeos.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "chrome/browser/memory/memory_kills_monitor.h" | 30 #include "chrome/browser/memory/memory_kills_monitor.h" |
| 31 #include "chrome/browser/memory/tab_stats.h" | 31 #include "chrome/browser/memory/tab_stats.h" |
| 32 #include "chrome/browser/ui/browser.h" | 32 #include "chrome/browser/ui/browser.h" |
| 33 #include "chrome/browser/ui/browser_list.h" | 33 #include "chrome/browser/ui/browser_list.h" |
| 34 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 34 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 35 #include "chrome/common/chrome_constants.h" | 35 #include "chrome/common/chrome_constants.h" |
| 36 #include "chrome/common/chrome_features.h" | 36 #include "chrome/common/chrome_features.h" |
| 37 #include "chromeos/dbus/dbus_thread_manager.h" | 37 #include "chromeos/dbus/dbus_thread_manager.h" |
| 38 #include "components/arc/arc_bridge_service.h" | 38 #include "components/arc/arc_bridge_service.h" |
| 39 #include "components/arc/arc_service_manager.h" | 39 #include "components/arc/arc_service_manager.h" |
| 40 #include "components/arc/arc_util.h" |
| 40 #include "components/device_event_log/device_event_log.h" | 41 #include "components/device_event_log/device_event_log.h" |
| 41 #include "components/exo/shell_surface.h" | |
| 42 #include "content/public/browser/browser_thread.h" | 42 #include "content/public/browser/browser_thread.h" |
| 43 #include "content/public/browser/notification_service.h" | 43 #include "content/public/browser/notification_service.h" |
| 44 #include "content/public/browser/notification_types.h" | 44 #include "content/public/browser/notification_types.h" |
| 45 #include "content/public/browser/render_process_host.h" | 45 #include "content/public/browser/render_process_host.h" |
| 46 #include "content/public/browser/render_widget_host.h" | 46 #include "content/public/browser/render_widget_host.h" |
| 47 #include "content/public/browser/zygote_host_linux.h" | 47 #include "content/public/browser/zygote_host_linux.h" |
| 48 #include "ui/aura/window.h" | |
| 49 #include "ui/wm/public/activation_client.h" | 48 #include "ui/wm/public/activation_client.h" |
| 50 | 49 |
| 51 using base::ProcessHandle; | 50 using base::ProcessHandle; |
| 52 using base::TimeDelta; | 51 using base::TimeDelta; |
| 53 using base::TimeTicks; | 52 using base::TimeTicks; |
| 54 using content::BrowserThread; | 53 using content::BrowserThread; |
| 55 | 54 |
| 56 namespace memory { | 55 namespace memory { |
| 57 namespace { | 56 namespace { |
| 58 | 57 |
| 59 const char kExoShellSurfaceWindowName[] = "ExoShellSurface"; | |
| 60 const char kArcProcessNamePrefix[] = "org.chromium.arc."; | |
| 61 | |
| 62 // When switching to a new tab the tab's renderer's OOM score needs to be | 58 // When switching to a new tab the tab's renderer's OOM score needs to be |
| 63 // updated to reflect its front-most status and protect it from discard. | 59 // updated to reflect its front-most status and protect it from discard. |
| 64 // However, doing this immediately might slow down tab switch time, so wait | 60 // However, doing this immediately might slow down tab switch time, so wait |
| 65 // a little while before doing the adjustment. | 61 // a little while before doing the adjustment. |
| 66 const int kFocusedProcessScoreAdjustIntervalMs = 500; | 62 const int kFocusedProcessScoreAdjustIntervalMs = 500; |
| 67 | 63 |
| 68 aura::client::ActivationClient* GetActivationClient() { | 64 aura::client::ActivationClient* GetActivationClient() { |
| 69 if (!ash::Shell::HasInstance()) | 65 if (!ash::Shell::HasInstance()) |
| 70 return nullptr; | 66 return nullptr; |
| 71 return aura::client::GetActivationClient(ash::Shell::GetPrimaryRootWindow()); | 67 return aura::client::GetActivationClient(ash::Shell::GetPrimaryRootWindow()); |
| 72 } | 68 } |
| 73 | 69 |
| 74 // Checks if a window renders ARC apps. | |
| 75 bool IsArcWindow(aura::Window* window) { | |
| 76 if (!window || window->GetName() != kExoShellSurfaceWindowName) | |
| 77 return false; | |
| 78 std::string application_id = exo::ShellSurface::GetApplicationId(window); | |
| 79 return base::StartsWith(application_id, kArcProcessNamePrefix, | |
| 80 base::CompareCase::SENSITIVE); | |
| 81 } | |
| 82 | |
| 83 bool IsArcMemoryManagementEnabled() { | 70 bool IsArcMemoryManagementEnabled() { |
| 84 return base::FeatureList::IsEnabled(features::kArcMemoryManagement); | 71 return base::FeatureList::IsEnabled(features::kArcMemoryManagement); |
| 85 } | 72 } |
| 86 | 73 |
| 87 void OnSetOomScoreAdj(bool success, const std::string& output) { | 74 void OnSetOomScoreAdj(bool success, const std::string& output) { |
| 88 VLOG(2) << "OnSetOomScoreAdj " << success << " " << output; | 75 VLOG(2) << "OnSetOomScoreAdj " << success << " " << output; |
| 89 if (!success) | 76 if (!success) |
| 90 LOG(ERROR) << "Set OOM score error: " << output; | 77 LOG(ERROR) << "Set OOM score error: " << output; |
| 91 else if (!output.empty()) | 78 else if (!output.empty()) |
| 92 LOG(WARNING) << "Set OOM score: " << output; | 79 LOG(WARNING) << "Set OOM score: " << output; |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 return; | 320 return; |
| 334 | 321 |
| 335 base::ProcessHandle pid = contents->GetRenderProcessHost()->GetHandle(); | 322 base::ProcessHandle pid = contents->GetRenderProcessHost()->GetHandle(); |
| 336 AdjustFocusedTabScore(pid); | 323 AdjustFocusedTabScore(pid); |
| 337 } | 324 } |
| 338 | 325 |
| 339 void TabManagerDelegate::OnWindowActivated( | 326 void TabManagerDelegate::OnWindowActivated( |
| 340 aura::client::ActivationChangeObserver::ActivationReason reason, | 327 aura::client::ActivationChangeObserver::ActivationReason reason, |
| 341 aura::Window* gained_active, | 328 aura::Window* gained_active, |
| 342 aura::Window* lost_active) { | 329 aura::Window* lost_active) { |
| 343 if (IsArcWindow(gained_active)) { | 330 if (arc::IsArcAppWindow(gained_active)) { |
| 344 // Currently there is no way to know which app is displayed in the ARC | 331 // Currently there is no way to know which app is displayed in the ARC |
| 345 // window, so schedule an early adjustment for all processes to reflect | 332 // window, so schedule an early adjustment for all processes to reflect |
| 346 // the change. | 333 // the change. |
| 347 // Put a dummy FocusedProcess with nspid = kInvalidArcAppNspid for now to | 334 // Put a dummy FocusedProcess with nspid = kInvalidArcAppNspid for now to |
| 348 // indicate the focused process is an arc app. | 335 // indicate the focused process is an arc app. |
| 349 // TODO(cylee): Fix it when we have nspid info in ARC windows. | 336 // TODO(cylee): Fix it when we have nspid info in ARC windows. |
| 350 focused_process_->SetArcAppNspid(FocusedProcess::kInvalidArcAppNspid); | 337 focused_process_->SetArcAppNspid(FocusedProcess::kInvalidArcAppNspid); |
| 351 // If the timer is already running (possibly for a tab), it'll be reset | 338 // If the timer is already running (possibly for a tab), it'll be reset |
| 352 // here. | 339 // here. |
| 353 focus_process_score_adjust_timer_.Start( | 340 focus_process_score_adjust_timer_.Start( |
| 354 FROM_HERE, | 341 FROM_HERE, |
| 355 TimeDelta::FromMilliseconds(kFocusedProcessScoreAdjustIntervalMs), | 342 TimeDelta::FromMilliseconds(kFocusedProcessScoreAdjustIntervalMs), |
| 356 this, &TabManagerDelegate::ScheduleEarlyOomPrioritiesAdjustment); | 343 this, &TabManagerDelegate::ScheduleEarlyOomPrioritiesAdjustment); |
| 357 } | 344 } |
| 358 if (IsArcWindow(lost_active)) { | 345 if (arc::IsArcAppWindow(lost_active)) { |
| 359 // Do not bother adjusting OOM score if the ARC window is deactivated | 346 // Do not bother adjusting OOM score if the ARC window is deactivated |
| 360 // shortly. | 347 // shortly. |
| 361 if (focused_process_->ResetIfIsArcApp() && | 348 if (focused_process_->ResetIfIsArcApp() && |
| 362 focus_process_score_adjust_timer_.IsRunning()) | 349 focus_process_score_adjust_timer_.IsRunning()) |
| 363 focus_process_score_adjust_timer_.Stop(); | 350 focus_process_score_adjust_timer_.Stop(); |
| 364 } | 351 } |
| 365 } | 352 } |
| 366 | 353 |
| 367 void TabManagerDelegate::ScheduleEarlyOomPrioritiesAdjustment() { | 354 void TabManagerDelegate::ScheduleEarlyOomPrioritiesAdjustment() { |
| 368 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 355 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 priority += priority_increment; | 759 priority += priority_increment; |
| 773 } | 760 } |
| 774 | 761 |
| 775 if (oom_scores_to_change.size()) { | 762 if (oom_scores_to_change.size()) { |
| 776 GetDebugDaemonClient()->SetOomScoreAdj( | 763 GetDebugDaemonClient()->SetOomScoreAdj( |
| 777 oom_scores_to_change, base::Bind(&OnSetOomScoreAdj)); | 764 oom_scores_to_change, base::Bind(&OnSetOomScoreAdj)); |
| 778 } | 765 } |
| 779 } | 766 } |
| 780 | 767 |
| 781 } // namespace memory | 768 } // namespace memory |
| OLD | NEW |