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