| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/gpu/gpu_process_host.h" | 5 #include "content/browser/gpu/gpu_process_host.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <list> | 10 #include <list> |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessTerminationStatus", | 541 UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessTerminationStatus", |
| 542 status, | 542 status, |
| 543 base::TERMINATION_STATUS_MAX_ENUM); | 543 base::TERMINATION_STATUS_MAX_ENUM); |
| 544 | 544 |
| 545 if (status == base::TERMINATION_STATUS_NORMAL_TERMINATION || | 545 if (status == base::TERMINATION_STATUS_NORMAL_TERMINATION || |
| 546 status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || | 546 status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || |
| 547 status == base::TERMINATION_STATUS_PROCESS_CRASHED) { | 547 status == base::TERMINATION_STATUS_PROCESS_CRASHED) { |
| 548 // Windows always returns PROCESS_CRASHED on abnormal termination, as it | 548 // Windows always returns PROCESS_CRASHED on abnormal termination, as it |
| 549 // doesn't have a way to distinguish the two. | 549 // doesn't have a way to distinguish the two. |
| 550 UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessExitCode", | 550 UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessExitCode", |
| 551 exit_code, | 551 static_cast<ResultCode>(exit_code), |
| 552 RESULT_CODE_LAST_CODE); | 552 RESULT_CODE_LAST_CODE); |
| 553 } | 553 } |
| 554 | 554 |
| 555 switch (status) { | 555 switch (status) { |
| 556 case base::TERMINATION_STATUS_NORMAL_TERMINATION: | 556 case base::TERMINATION_STATUS_NORMAL_TERMINATION: |
| 557 // Don't block offscreen contexts (and force page reload for webgl) | 557 // Don't block offscreen contexts (and force page reload for webgl) |
| 558 // if this was an intentional shutdown or the OOM killer on Android | 558 // if this was an intentional shutdown or the OOM killer on Android |
| 559 // killed us while Chrome was in the background. | 559 // killed us while Chrome was in the background. |
| 560 // TODO(crbug.com/598400): Restrict this to Android for now, since other | 560 // TODO(crbug.com/598400): Restrict this to Android for now, since other |
| 561 // platforms might fall through here for the 'exit_on_context_lost' workaround. | 561 // platforms might fall through here for the 'exit_on_context_lost' workaround. |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1107 static base::Time last_gpu_crash_time; | 1107 static base::Time last_gpu_crash_time; |
| 1108 | 1108 |
| 1109 bool disable_crash_limit = base::CommandLine::ForCurrentProcess()->HasSwitch( | 1109 bool disable_crash_limit = base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1110 switches::kDisableGpuProcessCrashLimit); | 1110 switches::kDisableGpuProcessCrashLimit); |
| 1111 | 1111 |
| 1112 // Ending only acts as a failure if the GPU process was actually started and | 1112 // Ending only acts as a failure if the GPU process was actually started and |
| 1113 // was intended for actual rendering (and not just checking caps or other | 1113 // was intended for actual rendering (and not just checking caps or other |
| 1114 // options). | 1114 // options). |
| 1115 if (process_launched_ && kind_ == GPU_PROCESS_KIND_SANDBOXED) { | 1115 if (process_launched_ && kind_ == GPU_PROCESS_KIND_SANDBOXED) { |
| 1116 if (swiftshader_rendering_) { | 1116 if (swiftshader_rendering_) { |
| 1117 UMA_HISTOGRAM_ENUMERATION("GPU.SwiftShaderLifetimeEvents", | 1117 UMA_HISTOGRAM_EXACT_LINEAR( |
| 1118 DIED_FIRST_TIME + swiftshader_crash_count_, | 1118 "GPU.SwiftShaderLifetimeEvents", |
| 1119 GPU_PROCESS_LIFETIME_EVENT_MAX); | 1119 DIED_FIRST_TIME + swiftshader_crash_count_, |
| 1120 static_cast<int>(GPU_PROCESS_LIFETIME_EVENT_MAX)); |
| 1120 | 1121 |
| 1121 if (++swiftshader_crash_count_ >= kGpuMaxCrashCount && | 1122 if (++swiftshader_crash_count_ >= kGpuMaxCrashCount && |
| 1122 !disable_crash_limit) { | 1123 !disable_crash_limit) { |
| 1123 // SwiftShader is too unstable to use. Disable it for current session. | 1124 // SwiftShader is too unstable to use. Disable it for current session. |
| 1124 gpu_enabled_ = false; | 1125 gpu_enabled_ = false; |
| 1125 } | 1126 } |
| 1126 } else { | 1127 } else { |
| 1127 ++gpu_crash_count_; | 1128 ++gpu_crash_count_; |
| 1128 UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessLifetimeEvents", | 1129 UMA_HISTOGRAM_EXACT_LINEAR( |
| 1129 std::min(DIED_FIRST_TIME + gpu_crash_count_, | 1130 "GPU.GPUProcessLifetimeEvents", |
| 1130 GPU_PROCESS_LIFETIME_EVENT_MAX - 1), | 1131 std::min(DIED_FIRST_TIME + gpu_crash_count_, |
| 1131 GPU_PROCESS_LIFETIME_EVENT_MAX); | 1132 GPU_PROCESS_LIFETIME_EVENT_MAX - 1), |
| 1133 static_cast<int>(GPU_PROCESS_LIFETIME_EVENT_MAX)); |
| 1132 | 1134 |
| 1133 // Allow about 1 GPU crash per hour to be removed from the crash count, | 1135 // Allow about 1 GPU crash per hour to be removed from the crash count, |
| 1134 // so very occasional crashes won't eventually add up and prevent the | 1136 // so very occasional crashes won't eventually add up and prevent the |
| 1135 // GPU process from launching. | 1137 // GPU process from launching. |
| 1136 ++gpu_recent_crash_count_; | 1138 ++gpu_recent_crash_count_; |
| 1137 base::Time current_time = base::Time::Now(); | 1139 base::Time current_time = base::Time::Now(); |
| 1138 if (crashed_before_) { | 1140 if (crashed_before_) { |
| 1139 int hours_different = (current_time - last_gpu_crash_time).InHours(); | 1141 int hours_different = (current_time - last_gpu_crash_time).InHours(); |
| 1140 gpu_recent_crash_count_ = | 1142 gpu_recent_crash_count_ = |
| 1141 std::max(0, gpu_recent_crash_count_ - hours_different); | 1143 std::max(0, gpu_recent_crash_count_ - hours_different); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1207 if (!cache.get()) | 1209 if (!cache.get()) |
| 1208 return; | 1210 return; |
| 1209 | 1211 |
| 1210 cache->set_shader_loaded_callback(base::Bind(&GpuProcessHost::LoadedShader, | 1212 cache->set_shader_loaded_callback(base::Bind(&GpuProcessHost::LoadedShader, |
| 1211 weak_ptr_factory_.GetWeakPtr())); | 1213 weak_ptr_factory_.GetWeakPtr())); |
| 1212 | 1214 |
| 1213 client_id_to_shader_cache_[client_id] = cache; | 1215 client_id_to_shader_cache_[client_id] = cache; |
| 1214 } | 1216 } |
| 1215 | 1217 |
| 1216 } // namespace content | 1218 } // namespace content |
| OLD | NEW |