// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// Trace.h
//
// Header file containing internal declarations for event tracing infrastructure.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#pragma once
namespace Concurrency
{
namespace details
{
// Singleton ETW wrapper to avoid having a static dependency on advapi32.dll.
class Etw
{
private:
Etw() noexcept;
public:
ULONG RegisterGuids(WMIDPREQUEST controlCallBack, LPCGUID providerGuid, ULONG guidCount, PTRACE_GUID_REGISTRATION eventGuidRegistration, PTRACEHANDLE providerHandle);
ULONG UnregisterGuids(TRACEHANDLE handle);
ULONG Trace(TRACEHANDLE handle, PEVENT_TRACE_HEADER eventHeader);
TRACEHANDLE GetLoggerHandle(PVOID);
UCHAR GetEnableLevel(TRACEHANDLE handle);
ULONG GetEnableFlags(TRACEHANDLE handle);
private:
friend void ::Concurrency::details::_RegisterConcRTEventTracing();
typedef ULONG WINAPI FnRegisterTraceGuidsW(WMIDPREQUEST, PVOID, LPCGUID, ULONG, PTRACE_GUID_REGISTRATION, LPCWSTR, LPCWSTR, PTRACEHANDLE);
FnRegisterTraceGuidsW* m_pfnRegisterTraceGuidsW{};
typedef ULONG WINAPI FnUnregisterTraceGuids(TRACEHANDLE);
FnUnregisterTraceGuids* m_pfnUnregisterTraceGuids{};
typedef ULONG WINAPI FnTraceEvent(TRACEHANDLE, PEVENT_TRACE_HEADER);
FnTraceEvent* m_pfnTraceEvent{};
typedef TRACEHANDLE WINAPI FnGetTraceLoggerHandle(PVOID);
FnGetTraceLoggerHandle* m_pfnGetTraceLoggerHandle{};
typedef UCHAR WINAPI FnGetTraceEnableLevel(TRACEHANDLE);
FnGetTraceEnableLevel* m_pfnGetTraceEnableLevel{};
typedef ULONG WINAPI FnGetTraceEnableFlags(TRACEHANDLE);
FnGetTraceEnableFlags* m_pfnGetTraceEnableFlags{};
static _StaticLock s_lock;
};
extern _CONCRT_TRACE_INFO g_TraceInfo;
extern TRACEHANDLE g_ConcRTSessionHandle;
extern Etw* g_pEtw;
} // namespace details
///
/// Common trace header structure for all ConcRT diagnostic events
///
struct CONCRT_TRACE_EVENT_HEADER_COMMON
{
EVENT_TRACE_HEADER header;
DWORD VirtualProcessorID;
DWORD SchedulerID;
DWORD ContextID;
DWORD ScheduleGroupID;
};
///
/// Common trace payload for agents
///
struct AGENTS_TRACE_PAYLOAD
{
// Identifier of the agent or message block that is emitting the event
__int64 AgentId1;
union
{
// The identifier of a target block for link/unlink event
__int64 AgentId2;
// Count of messages processed for the end event
long Count;
// Name of this agent for the purposes of the ETW trace
wchar_t Name[32];
};
};
///
/// Common trace header structure for all Agents diagnostic events
///
struct AGENTS_TRACE_EVENT_DATA
{
EVENT_TRACE_HEADER header;
AGENTS_TRACE_PAYLOAD payload;
};
}