blob: fe802cb91e469d31472a1cfcbdee1e74e3de3f07 [file]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_METRICS_CALL_STACKS_STACK_SAMPLING_RECORDER_H_
#define COMPONENTS_METRICS_CALL_STACKS_STACK_SAMPLING_RECORDER_H_
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "components/metrics/call_stacks/call_stack_profile_metrics_provider.h"
namespace metrics {
// Instructs Chrome to record /tmp/stack-sampling-data with details of which
// threads and processes are being successfully stack-sampled.
inline constexpr char kRecordStackSamplingDataSwitch[] =
"record-stack-sampling-data";
// Regularly writes a file (default: /tmp/stack-sampling-data) listing which
// threads and processes have been successfully stack sampled.
//
// Used by a few ChromeOS tast tests. Not created during normal operations.
// Creation is controlled by kRecordStackSamplingDataSwitch.
class StackSamplingRecorder
: public base::RefCountedThreadSafe<StackSamplingRecorder> {
public:
StackSamplingRecorder();
StackSamplingRecorder(const StackSamplingRecorder&) = delete;
StackSamplingRecorder& operator=(const StackSamplingRecorder&) = delete;
void Start();
private:
friend class base::RefCountedThreadSafe<StackSamplingRecorder>;
// Friends to access some test-only functions
friend class TestingStackSamplingRecorder;
// Constructor for testing.
explicit StackSamplingRecorder(base::FilePath file_path);
virtual ~StackSamplingRecorder();
// Calls
// metrics::CallStackProfileMetricsProvider::GetSuccessfullyCollectedCounts()
// Virtual so we can override in tests.
virtual metrics::CallStackProfileMetricsProvider::ProcessThreadCount
GetSuccessfullyCollectedCounts() const;
// File writing callback.
void WriteFile();
// Helper for WriteFile(). A separate function so that we can return early on
// error, but always post a retry task inside WriteFile().
void WriteFileHelper();
// The path that the stack sampling data is written to.
const base::FilePath file_path_;
};
} // namespace metrics
#endif // COMPONENTS_METRICS_CALL_STACKS_STACK_SAMPLING_RECORDER_H_