chromium/remoting/host/win/etw_trace_controller.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef REMOTING_HOST_WIN_ETW_TRACE_CONTROLLER_H_
#define REMOTING_HOST_WIN_ETW_TRACE_CONTROLLER_H_

#include "base/sequence_checker.h"
#include "base/win/event_trace_controller.h"

namespace remoting {

// Used to control an ETW trace session for events logged by the remote access
// host.  Note: Only one instance of this class should be active at a time,
// otherwise the session started by the existing controller will be stopped.
class EtwTraceController {
 public:
  EtwTraceController();
  EtwTraceController(const EtwTraceController&) = delete;
  EtwTraceController& operator=(const EtwTraceController&) = delete;
  ~EtwTraceController();

  // Starts a trace session for events associated with the host provider GUID.
  // Returns true if this instance has started a trace session, otherwise false.
  // Note: This will attempt to stop other trace sessions (e.g. from sawbuck).
  bool Start();

  // Stops the active tracing session, if one has been started by this instance.
  void Stop();

  // The active trace session name or nullptr if there isn't an active session.
  const wchar_t* GetActiveSessionName() const;

 private:
  // Only one instance should exist at a time to prevent conflicts.
  static EtwTraceController* instance_;

  // Handles the Windows API calls needed for tracing.
  base::win::EtwTraceController controller_;

  // Used to ensure public method and destruction calls do not overlap.
  SEQUENCE_CHECKER(sequence_checker_);
};

}  // namespace remoting

#endif  // REMOTING_HOST_WIN_ETW_TRACE_CONTROLLER_H_