// Copyright 2020 the V8 project 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 V8_LIBPLATFORM_TRACING_RECORDER_WIN_H_ #define V8_LIBPLATFORM_TRACING_RECORDER_WIN_H_ #include <Windows.h> #include <TraceLoggingProvider.h> #include "src/libplatform/tracing/recorder.h" #if defined(__clang__) #pragma clang diagnostic ignored "-Wc++98-compat-extra-semi" #endif namespace v8 { namespace platform { namespace tracing { TRACELOGGING_DECLARE_PROVIDER(g_v8LibProvider); TRACELOGGING_DEFINE_PROVIDER(g_v8LibProvider, "V8.js", (V8_ETW_GUID)); Recorder::Recorder() { TraceLoggingRegister(g_v8LibProvider); } Recorder::~Recorder() { if (g_v8LibProvider) { TraceLoggingUnregister(g_v8LibProvider); } } bool Recorder::IsEnabled() { return TraceLoggingProviderEnabled(g_v8LibProvider, 0, 0); } bool Recorder::IsEnabled(const uint8_t level) { return TraceLoggingProviderEnabled(g_v8LibProvider, level, 0); } void Recorder::AddEvent(TraceObject* trace_event) { // TODO(sartang@microsoft.com): Figure out how to write the conditional // arguments wchar_t* wName = new wchar_t[4096]; MultiByteToWideChar(CP_ACP, 0, trace_event->name(), -1, wName, 4096); wchar_t* wCategoryGroupName = new wchar_t[4096]; MultiByteToWideChar(CP_ACP, 0, TracingController::GetCategoryGroupName( trace_event->category_enabled_flag()), -1, wCategoryGroupName, 4096); TraceLoggingWrite(g_v8LibProvider, "", TraceLoggingValue(wName, "Event Name"), TraceLoggingValue(trace_event->pid(), "pid"), TraceLoggingValue(trace_event->tid(), "tid"), TraceLoggingValue(trace_event->ts(), "ts"), TraceLoggingValue(trace_event->tts(), "tts"), TraceLoggingValue(trace_event->phase(), "phase"), TraceLoggingValue(wCategoryGroupName, "category"), TraceLoggingValue(trace_event->duration(), "dur"), TraceLoggingValue(trace_event->cpu_duration(), "tdur")); } } // namespace tracing } // namespace platform } // namespace v8 #endif // V8_LIBPLATFORM_TRACING_RECORDER_WIN_H_