process_resource_usage.cc 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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
  3. // found in the LICENSE file.
  4. #include "chrome/browser/process_resource_usage.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/check.h"
  8. #include "base/location.h"
  9. #include "base/task/single_thread_task_runner.h"
  10. #include "base/threading/thread_task_runner_handle.h"
  11. #include "content/public/common/resource_usage_reporter_type_converters.h"
  12. ProcessResourceUsage::ProcessResourceUsage(
  13. mojo::PendingRemote<content::mojom::ResourceUsageReporter> service)
  14. : service_(std::move(service)), update_in_progress_(false) {
  15. service_.set_disconnect_handler(
  16. base::BindOnce(&ProcessResourceUsage::RunPendingRefreshCallbacks,
  17. base::Unretained(this)));
  18. }
  19. ProcessResourceUsage::~ProcessResourceUsage() {
  20. DCHECK(thread_checker_.CalledOnValidThread());
  21. }
  22. void ProcessResourceUsage::RunPendingRefreshCallbacks() {
  23. DCHECK(thread_checker_.CalledOnValidThread());
  24. auto task_runner = base::ThreadTaskRunnerHandle::Get();
  25. base::circular_deque<base::OnceClosure> callbacks;
  26. std::swap(callbacks, refresh_callbacks_);
  27. for (auto& callback : callbacks)
  28. task_runner->PostTask(FROM_HERE, std::move(callback));
  29. }
  30. void ProcessResourceUsage::Refresh(base::OnceClosure callback) {
  31. DCHECK(thread_checker_.CalledOnValidThread());
  32. if (!service_ || !service_.is_connected()) {
  33. if (!callback.is_null())
  34. base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
  35. std::move(callback));
  36. return;
  37. }
  38. if (!callback.is_null())
  39. refresh_callbacks_.push_back(std::move(callback));
  40. if (!update_in_progress_) {
  41. update_in_progress_ = true;
  42. service_->GetUsageData(base::BindOnce(&ProcessResourceUsage::OnRefreshDone,
  43. base::Unretained(this)));
  44. }
  45. }
  46. void ProcessResourceUsage::OnRefreshDone(
  47. content::mojom::ResourceUsageDataPtr data) {
  48. DCHECK(thread_checker_.CalledOnValidThread());
  49. update_in_progress_ = false;
  50. stats_ = std::move(data);
  51. RunPendingRefreshCallbacks();
  52. }
  53. bool ProcessResourceUsage::ReportsV8MemoryStats() const {
  54. DCHECK(thread_checker_.CalledOnValidThread());
  55. if (stats_)
  56. return stats_->reports_v8_stats;
  57. return false;
  58. }
  59. size_t ProcessResourceUsage::GetV8MemoryAllocated() const {
  60. DCHECK(thread_checker_.CalledOnValidThread());
  61. if (stats_ && stats_->reports_v8_stats)
  62. return stats_->v8_bytes_allocated;
  63. return 0;
  64. }
  65. size_t ProcessResourceUsage::GetV8MemoryUsed() const {
  66. DCHECK(thread_checker_.CalledOnValidThread());
  67. if (stats_ && stats_->reports_v8_stats)
  68. return stats_->v8_bytes_used;
  69. return 0;
  70. }
  71. blink::WebCacheResourceTypeStats
  72. ProcessResourceUsage::GetBlinkMemoryCacheStats() const {
  73. DCHECK(thread_checker_.CalledOnValidThread());
  74. if (stats_ && stats_->web_cache_stats)
  75. return stats_->web_cache_stats->To<blink::WebCacheResourceTypeStats>();
  76. return {};
  77. }