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 #ifndef COMPONENTS_METRICS_DRIVE_METRICS_PROVIDER_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_DRIVE_METRICS_PROVIDER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 12*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_provider.h" 13*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/system_profile.pb.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker class FilePath; 17*6777b538SAndroid Build Coastguard Worker } 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker namespace metrics { 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // Provides metrics about the local drives on a user's computer. Currently only 22*6777b538SAndroid Build Coastguard Worker // checks to see if they incur a seek-time penalty (e.g. if they're SSDs). 23*6777b538SAndroid Build Coastguard Worker class DriveMetricsProvider : public metrics::MetricsProvider { 24*6777b538SAndroid Build Coastguard Worker public: 25*6777b538SAndroid Build Coastguard Worker explicit DriveMetricsProvider(int local_state_path_key); 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker DriveMetricsProvider(const DriveMetricsProvider&) = delete; 28*6777b538SAndroid Build Coastguard Worker DriveMetricsProvider& operator=(const DriveMetricsProvider&) = delete; 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker ~DriveMetricsProvider() override; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // metrics::MetricsProvider: 33*6777b538SAndroid Build Coastguard Worker void AsyncInit(base::OnceClosure done_callback) override; 34*6777b538SAndroid Build Coastguard Worker void ProvideSystemProfileMetrics( 35*6777b538SAndroid Build Coastguard Worker metrics::SystemProfileProto* system_profile_proto) override; 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker private: 38*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(DriveMetricsProviderTest, HasSeekPenalty); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // A response to querying a drive as to whether it incurs a seek penalty. 41*6777b538SAndroid Build Coastguard Worker // |has_seek_penalty| is set if |success| is true. 42*6777b538SAndroid Build Coastguard Worker struct SeekPenaltyResponse { 43*6777b538SAndroid Build Coastguard Worker SeekPenaltyResponse(); 44*6777b538SAndroid Build Coastguard Worker bool success; 45*6777b538SAndroid Build Coastguard Worker bool has_seek_penalty; 46*6777b538SAndroid Build Coastguard Worker }; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker struct DriveMetrics { 49*6777b538SAndroid Build Coastguard Worker SeekPenaltyResponse app_drive; 50*6777b538SAndroid Build Coastguard Worker SeekPenaltyResponse user_data_drive; 51*6777b538SAndroid Build Coastguard Worker }; 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // Determine whether the device that services |path| has a seek penalty. 54*6777b538SAndroid Build Coastguard Worker // Returns false if it couldn't be determined (e.g., |path| doesn't exist). 55*6777b538SAndroid Build Coastguard Worker static bool HasSeekPenalty(const base::FilePath& path, 56*6777b538SAndroid Build Coastguard Worker bool* has_seek_penalty); 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker // Gather metrics about various drives. Should be run on a background thread. 59*6777b538SAndroid Build Coastguard Worker static DriveMetrics GetDriveMetricsOnBackgroundThread( 60*6777b538SAndroid Build Coastguard Worker int local_state_path_key); 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // Tries to determine whether there is a penalty for seeking on the drive that 63*6777b538SAndroid Build Coastguard Worker // hosts |path_service_key| (for example: the drive that holds "Local State"). 64*6777b538SAndroid Build Coastguard Worker static void QuerySeekPenalty(int path_service_key, 65*6777b538SAndroid Build Coastguard Worker SeekPenaltyResponse* response); 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker // Called when metrics are done being gathered asynchronously. 68*6777b538SAndroid Build Coastguard Worker // |done_callback| is the callback that should be called once all metrics are 69*6777b538SAndroid Build Coastguard Worker // gathered. 70*6777b538SAndroid Build Coastguard Worker void GotDriveMetrics(base::OnceClosure done_callback, 71*6777b538SAndroid Build Coastguard Worker const DriveMetrics& metrics); 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker // Fills |drive| with information from successful |response|s. 74*6777b538SAndroid Build Coastguard Worker void FillDriveMetrics(const SeekPenaltyResponse& response, 75*6777b538SAndroid Build Coastguard Worker metrics::SystemProfileProto::Hardware::Drive* drive); 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker // The key to give to base::PathService to obtain the path to local state 78*6777b538SAndroid Build Coastguard Worker // (supplied by the embedder). 79*6777b538SAndroid Build Coastguard Worker int local_state_path_key_; 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker // Information gathered about various important drives. 82*6777b538SAndroid Build Coastguard Worker DriveMetrics metrics_; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 85*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<DriveMetricsProvider> weak_ptr_factory_{this}; 86*6777b538SAndroid Build Coastguard Worker }; 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker } // namespace metrics 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_METRICS_DRIVE_METRICS_PROVIDER_H_ 91