xref: /aosp_15_r20/external/cronet/components/metrics/drive_metrics_provider.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/drive_metrics_provider.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/base_paths.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/path_service.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/task/task_traits.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/threading/scoped_blocking_call.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace metrics {
19*6777b538SAndroid Build Coastguard Worker 
DriveMetricsProvider(int local_state_path_key)20*6777b538SAndroid Build Coastguard Worker DriveMetricsProvider::DriveMetricsProvider(int local_state_path_key)
21*6777b538SAndroid Build Coastguard Worker     : local_state_path_key_(local_state_path_key) {}
22*6777b538SAndroid Build Coastguard Worker 
~DriveMetricsProvider()23*6777b538SAndroid Build Coastguard Worker DriveMetricsProvider::~DriveMetricsProvider() {}
24*6777b538SAndroid Build Coastguard Worker 
ProvideSystemProfileMetrics(metrics::SystemProfileProto * system_profile_proto)25*6777b538SAndroid Build Coastguard Worker void DriveMetricsProvider::ProvideSystemProfileMetrics(
26*6777b538SAndroid Build Coastguard Worker     metrics::SystemProfileProto* system_profile_proto) {
27*6777b538SAndroid Build Coastguard Worker   auto* hardware = system_profile_proto->mutable_hardware();
28*6777b538SAndroid Build Coastguard Worker   FillDriveMetrics(metrics_.app_drive, hardware->mutable_app_drive());
29*6777b538SAndroid Build Coastguard Worker   FillDriveMetrics(metrics_.user_data_drive,
30*6777b538SAndroid Build Coastguard Worker                    hardware->mutable_user_data_drive());
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker 
AsyncInit(base::OnceClosure done_callback)33*6777b538SAndroid Build Coastguard Worker void DriveMetricsProvider::AsyncInit(base::OnceClosure done_callback) {
34*6777b538SAndroid Build Coastguard Worker   base::ThreadPool::PostTaskAndReplyWithResult(
35*6777b538SAndroid Build Coastguard Worker       FROM_HERE,
36*6777b538SAndroid Build Coastguard Worker       {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
37*6777b538SAndroid Build Coastguard Worker        base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
38*6777b538SAndroid Build Coastguard Worker       base::BindOnce(&DriveMetricsProvider::GetDriveMetricsOnBackgroundThread,
39*6777b538SAndroid Build Coastguard Worker                      local_state_path_key_),
40*6777b538SAndroid Build Coastguard Worker       base::BindOnce(&DriveMetricsProvider::GotDriveMetrics,
41*6777b538SAndroid Build Coastguard Worker                      weak_ptr_factory_.GetWeakPtr(), std::move(done_callback)));
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker 
SeekPenaltyResponse()44*6777b538SAndroid Build Coastguard Worker DriveMetricsProvider::SeekPenaltyResponse::SeekPenaltyResponse()
45*6777b538SAndroid Build Coastguard Worker     : success(false) {}
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker // static
48*6777b538SAndroid Build Coastguard Worker DriveMetricsProvider::DriveMetrics
GetDriveMetricsOnBackgroundThread(int local_state_path_key)49*6777b538SAndroid Build Coastguard Worker DriveMetricsProvider::GetDriveMetricsOnBackgroundThread(
50*6777b538SAndroid Build Coastguard Worker     int local_state_path_key) {
51*6777b538SAndroid Build Coastguard Worker   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
52*6777b538SAndroid Build Coastguard Worker                                                 base::BlockingType::WILL_BLOCK);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   DriveMetricsProvider::DriveMetrics metrics;
55*6777b538SAndroid Build Coastguard Worker   QuerySeekPenalty(base::FILE_EXE, &metrics.app_drive);
56*6777b538SAndroid Build Coastguard Worker   QuerySeekPenalty(local_state_path_key, &metrics.user_data_drive);
57*6777b538SAndroid Build Coastguard Worker   return metrics;
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker // static
QuerySeekPenalty(int path_service_key,DriveMetricsProvider::SeekPenaltyResponse * response)61*6777b538SAndroid Build Coastguard Worker void DriveMetricsProvider::QuerySeekPenalty(
62*6777b538SAndroid Build Coastguard Worker     int path_service_key,
63*6777b538SAndroid Build Coastguard Worker     DriveMetricsProvider::SeekPenaltyResponse* response) {
64*6777b538SAndroid Build Coastguard Worker   DCHECK(response);
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   base::FilePath path;
67*6777b538SAndroid Build Coastguard Worker   if (!base::PathService::Get(path_service_key, &path))
68*6777b538SAndroid Build Coastguard Worker     return;
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   response->success = HasSeekPenalty(path, &response->has_seek_penalty);
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker 
GotDriveMetrics(base::OnceClosure done_callback,const DriveMetricsProvider::DriveMetrics & metrics)73*6777b538SAndroid Build Coastguard Worker void DriveMetricsProvider::GotDriveMetrics(
74*6777b538SAndroid Build Coastguard Worker     base::OnceClosure done_callback,
75*6777b538SAndroid Build Coastguard Worker     const DriveMetricsProvider::DriveMetrics& metrics) {
76*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
77*6777b538SAndroid Build Coastguard Worker   metrics_ = metrics;
78*6777b538SAndroid Build Coastguard Worker   std::move(done_callback).Run();
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker 
FillDriveMetrics(const DriveMetricsProvider::SeekPenaltyResponse & response,metrics::SystemProfileProto::Hardware::Drive * drive)81*6777b538SAndroid Build Coastguard Worker void DriveMetricsProvider::FillDriveMetrics(
82*6777b538SAndroid Build Coastguard Worker     const DriveMetricsProvider::SeekPenaltyResponse& response,
83*6777b538SAndroid Build Coastguard Worker     metrics::SystemProfileProto::Hardware::Drive* drive) {
84*6777b538SAndroid Build Coastguard Worker   if (response.success)
85*6777b538SAndroid Build Coastguard Worker     drive->set_has_seek_penalty(response.has_seek_penalty);
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
89