blob: 6ba943e0880dbe202536cb720b75fab1126c630f [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_METRICS_PERF_PROVIDER_CHROMEOS_H_
#define CHROME_BROWSER_METRICS_PERF_PROVIDER_CHROMEOS_H_
#include <string>
#include "base/basictypes.h"
#include "base/threading/non_thread_safe.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "chrome/common/metrics/proto/perf_data.pb.h"
namespace metrics {
class WindowedIncognitoObserver;
// Provides access to ChromeOS perf data. perf aka "perf events" is a
// performance profiling infrastructure built into the linux kernel. For more
// information, see: https://perf.wiki.kernel.org/index.php/Main_Page.
class PerfProvider : public base::NonThreadSafe {
public:
PerfProvider();
~PerfProvider();
// Gets the collected perf data protobuf and writes it to |perf_data_proto|.
// Returns true if it wrote to |perf_data_proto|.
bool GetPerfData(PerfDataProto* perf_data_proto);
private:
enum PerfDataState {
// Indicates that we are ready to collect perf data.
READY_TO_COLLECT,
// Indicates that we are ready to upload perf data.
READY_TO_UPLOAD,
};
// Starts an internal timer to start collecting perf data. The timer is set to
// trigger |interval| after this function call.
void ScheduleCollection(const base::TimeDelta& interval);
// Collects perf data if it has not been consumed by calling GetPerfData()
// (see above).
void CollectIfNecessary();
// Collects perf data by calling CollectIfNecessary() and reschedules it to be
// collected again.
void CollectIfNecessaryAndReschedule();
// Parses a protobuf from the |data| passed in only if the
// |incognito_observer| indicates that no incognito window had been opened
// during the profile collection period.
void ParseProtoIfValid(
scoped_ptr<WindowedIncognitoObserver> incognito_observer,
const std::vector<uint8>& data);
// The internal state can be one of the enum values above.
PerfDataState state_;
// Protobuf that has the perf data.
PerfDataProto perf_data_proto_;
// For scheduling collection of perf data.
base::OneShotTimer<PerfProvider> timer_;
// To pass around the "this" pointer across threads safely.
base::WeakPtrFactory<PerfProvider> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(PerfProvider);
};
} // namespace system
#endif // CHROME_BROWSER_METRICS_PERF_PROVIDER_CHROMEOS_H_