| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TOOLS_MAC_POWER_POWER_SAMPLER_SAMPLING_CONTROLLER_H_ |
| #define TOOLS_MAC_POWER_POWER_SAMPLER_SAMPLING_CONTROLLER_H_ |
| |
| #include <functional> |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/containers/flat_map.h" |
| |
| namespace power_sampler { |
| |
| class Sampler; |
| class Monitor; |
| struct DataColumnKey; |
| |
| // The sampling controller takes care of colleting datums from all samplers |
| // on a sampling event. |
| class SamplingController { |
| public: |
| SamplingController(); |
| ~SamplingController(); |
| |
| // Adds |sampler| to this controller if it has a unique name. |
| // Returns true if |sampler| was added to the controller. |
| bool AddSampler(std::unique_ptr<Sampler> sampler); |
| |
| // Adds |monitor| to this controller. |
| // Each monitor is called after a sample is acquired to evaluate whether the |
| // sampling session should end. |
| void AddMonitor(std::unique_ptr<Monitor> monitor); |
| |
| // Call once after all samplers and monitors have been added. |
| // Will notify monitors that a session is starting. |
| void StartSession(); |
| |
| // Returns true iff this controller has all the samples it wants. |
| bool OnSamplingEvent(); |
| |
| // Returns true if any samplers have been added. |
| bool HasSamplers(); |
| |
| // Call once after the last call to OnSamplingEvent. |
| // Will notify monitors that a session has ended. |
| void EndSession(); |
| |
| // TODO(siggi): We want to at least have a sampling event provider that |
| // ticks on IOPMPowerSource change notification, plus a simple timed |
| // source. |
| // TODO(siggi): We want to output samples in CSV at least, maybe other |
| // formats? Outputting samples as they're collected seems the best |
| // strategy? |
| |
| private: |
| using Samplers = std::vector<std::unique_ptr<Sampler>>; |
| using Monitors = std::vector<std::unique_ptr<Monitor>>; |
| |
| Samplers samplers_; |
| Monitors monitors_; |
| |
| base::flat_map<DataColumnKey, std::string> data_columns_units_; |
| |
| bool started_ = false; |
| }; |
| |
| } // namespace power_sampler |
| |
| #endif // TOOLS_MAC_POWER_POWER_SAMPLER_SAMPLING_CONTROLLER_H_ |