// Copyright 2015 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.

// This file contains the Windows-specific exporting to ETW.
#ifndef BASE_TRACE_EVENT_TRACE_ETW_EXPORT_H_
#define BASE_TRACE_EVENT_TRACE_ETW_EXPORT_H_

#include "base/base_export.h"
#include "base/trace_event/trace_event_impl.h"

// Fwd.
template <typename Type>
struct StaticMemorySingletonTraits;

namespace base {
namespace trace_event {

class BASE_EXPORT TraceEventETWExport {
 public:
  ~TraceEventETWExport();

  // Retrieves the singleton.
  // Note that this may return NULL post-AtExit processing.
  static TraceEventETWExport* GetInstance();

  // Enables/disables exporting of events to ETW. If disabled,
  // AddEvent and AddCustomEvent will simply return when called.
  static void EnableETWExport();
  static void DisableETWExport();

  static bool isETWExportEnabled() {
    return (GetInstance() && GetInstance()->ETWExportEnabled_);
  }

  // Exports an event to ETW. This is mainly used in
  // TraceLog::AddTraceEventWithThreadIdAndTimestamp to export internal events.
  static void AddEvent(
      char phase,
      const unsigned char* category_group_enabled,
      const char* name,
      unsigned long long id,
      int num_args,
      const char** arg_names,
      const unsigned char* arg_types,
      const unsigned long long* arg_values,
      const scoped_refptr<ConvertableToTraceFormat>* convertable_values);

  // Exports an event to ETW. This should be used when exporting an event only
  // to ETW. Supports three arguments to be passed to ETW.
  // TODO(georgesak): Allow different providers.
  static void AddCustomEvent(const char* name,
                             char const* phase,
                             const char* arg_name_1,
                             const char* arg_value_1,
                             const char* arg_name_2,
                             const char* arg_value_2,
                             const char* arg_name_3,
                             const char* arg_value_3);

  void Resurrect();

 private:
  bool ETWExportEnabled_;
  // Ensure only the provider can construct us.
  friend struct StaticMemorySingletonTraits<TraceEventETWExport>;
  TraceEventETWExport();

  DISALLOW_COPY_AND_ASSIGN(TraceEventETWExport);
};

}  // namespace trace_event
}  // namespace base

#endif  // BASE_TRACE_EVENT_TRACE_ETW_EXPORT_H_
