ash_tracing_manager.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Copyright 2021 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 "ash/hud_display/ash_tracing_manager.h"
  5. #include <vector>
  6. #include "ash/hud_display/ash_tracing_request.h"
  7. #include "ash/session/session_controller_impl.h"
  8. #include "base/compiler_specific.h"
  9. #include "base/logging.h"
  10. #include "base/no_destructor.h"
  11. #include "base/sequence_checker.h"
  12. #include "base/strings/stringprintf.h"
  13. namespace ash {
  14. namespace hud_display {
  15. AshTracingManager::AshTracingManager() {
  16. SessionController::Get()->AddObserver(this);
  17. }
  18. AshTracingManager::~AshTracingManager() {
  19. if (SessionController::Get())
  20. SessionController::Get()->RemoveObserver(this);
  21. }
  22. // static
  23. AshTracingManager& AshTracingManager::Get() {
  24. static base::NoDestructor<AshTracingManager> manager;
  25. return *manager;
  26. }
  27. bool AshTracingManager::IsBusy() const {
  28. if (tracing_requests_.empty())
  29. return false;
  30. switch (GetLastRequestStatus()) {
  31. case AshTracingRequest::Status::kEmpty:
  32. [[fallthrough]];
  33. case AshTracingRequest::Status::kInitialized:
  34. return true;
  35. case AshTracingRequest::Status::kStarted:
  36. return false;
  37. case AshTracingRequest::Status::kStopping:
  38. return true;
  39. case AshTracingRequest::Status::kPendingMount:
  40. [[fallthrough]];
  41. case AshTracingRequest::Status::kWritingFile:
  42. [[fallthrough]];
  43. case AshTracingRequest::Status::kCompleted:
  44. return false;
  45. }
  46. }
  47. bool AshTracingManager::IsTracingStarted() const {
  48. if (tracing_requests_.empty())
  49. return false;
  50. switch (GetLastRequestStatus()) {
  51. case AshTracingRequest::Status::kEmpty:
  52. [[fallthrough]];
  53. case AshTracingRequest::Status::kInitialized:
  54. [[fallthrough]];
  55. case AshTracingRequest::Status::kStarted:
  56. [[fallthrough]];
  57. case AshTracingRequest::Status::kStopping:
  58. return true;
  59. case AshTracingRequest::Status::kPendingMount:
  60. [[fallthrough]];
  61. case AshTracingRequest::Status::kWritingFile:
  62. [[fallthrough]];
  63. case AshTracingRequest::Status::kCompleted:
  64. return false;
  65. }
  66. }
  67. std::string AshTracingManager::GetStatusMessage() const {
  68. std::string result;
  69. if (tracing_requests_.empty())
  70. return result;
  71. unsigned started = 0;
  72. unsigned waiting_for_login = 0;
  73. unsigned writing_trace_file = 0;
  74. unsigned completed = 0;
  75. for (const auto& request : tracing_requests_) {
  76. switch (request->status()) {
  77. case AshTracingRequest::Status::kEmpty:
  78. [[fallthrough]];
  79. case AshTracingRequest::Status::kInitialized:
  80. [[fallthrough]];
  81. case AshTracingRequest::Status::kStarted:
  82. [[fallthrough]];
  83. case AshTracingRequest::Status::kStopping:
  84. ++started;
  85. break;
  86. case AshTracingRequest::Status::kPendingMount:
  87. ++waiting_for_login;
  88. break;
  89. case AshTracingRequest::Status::kWritingFile:
  90. ++writing_trace_file;
  91. break;
  92. case AshTracingRequest::Status::kCompleted:
  93. ++completed;
  94. }
  95. }
  96. if (started)
  97. result = base::StringPrintf("%u active", started);
  98. if (waiting_for_login) {
  99. if (!result.empty())
  100. result += ", ";
  101. result += base::StringPrintf("%u pending login", waiting_for_login);
  102. }
  103. if (writing_trace_file) {
  104. if (!result.empty())
  105. result += ", ";
  106. result += base::StringPrintf("%u writing", writing_trace_file);
  107. }
  108. if (completed) {
  109. if (!result.empty())
  110. result += ", ";
  111. result += base::StringPrintf("%u completed", completed);
  112. }
  113. if (!result.empty())
  114. result = std::string("Tracing: ") + result + ".";
  115. return result;
  116. }
  117. void AshTracingManager::Start() {
  118. DCHECK(!IsBusy());
  119. DCHECK(!IsTracingStarted());
  120. tracing_requests_.push_back(std::make_unique<AshTracingRequest>(this));
  121. }
  122. void AshTracingManager::Stop() {
  123. DCHECK(!tracing_requests_.empty());
  124. DCHECK_EQ(GetLastRequestStatus(), AshTracingRequest::Status::kStarted);
  125. tracing_requests_.back()->Stop();
  126. }
  127. void AshTracingManager::AddObserver(AshTracingManager::Observer* observer) {
  128. observers_.AddObserver(observer);
  129. }
  130. void AshTracingManager::RemoveObserver(AshTracingManager::Observer* observer) {
  131. observers_.RemoveObserver(observer);
  132. }
  133. void AshTracingManager::OnRequestStatusChanged(AshTracingRequest* request) {
  134. for (Observer& observer : observers_)
  135. observer.OnTracingStatusChange();
  136. }
  137. void AshTracingManager::OnFirstSessionStarted() {
  138. for (auto& request : tracing_requests_)
  139. request->OnUserLoggedIn();
  140. }
  141. const std::vector<std::unique_ptr<AshTracingRequest>>&
  142. AshTracingManager::GetTracingRequestsForTesting() const {
  143. return tracing_requests_;
  144. }
  145. AshTracingRequest::Status AshTracingManager::GetLastRequestStatus() const {
  146. return tracing_requests_.back()->status();
  147. }
  148. } // namespace hud_display
  149. } // namespace ash