blob: fb0fcfdf973e4a7e8cbe95a0af48ca29ea0d91c2 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "RuntimeBasePch.h"
#ifdef ENABLE_FOUNDATION_OBJECT
using namespace Windows::Foundation::Diagnostics;
#define IfFailReturnNULL(op) \
if (FAILED(hr=(op))) { return NULL; }; \
namespace Js
{
inline DelayLoadWinRtString* WindowsFoundationAdapter::GetWinRtStringLibrary(_In_ ScriptContext* scriptContext)
{
return scriptContext->GetThreadContext()->GetWinRTStringLibrary();
}
inline DelayLoadWinRtFoundation* WindowsFoundationAdapter::GetWinRtFoundationLibrary(_In_ ScriptContext* scriptContext)
{
return scriptContext->GetThreadContext()->GetWinRtFoundationLibrary();
}
IActivationFactory* WindowsFoundationAdapter::GetAsyncCausalityTracerActivationFactory(_In_ ScriptContext* scriptContext)
{
if (! asyncCausalityTracerActivationFactory)
{
HRESULT hr;
HSTRING hString;
HSTRING_HEADER hStringHdr;
LPCWSTR factoryName = _u("Windows.Foundation.Diagnostics.AsyncCausalityTracer");
UINT32 factoryNameLen = _countof(_u("Windows.Foundation.Diagnostics.AsyncCausalityTracer")) - 1;
IID factoryIID = __uuidof(IAsyncCausalityTracerStatics);
IfFailReturnNULL(GetWinRtStringLibrary(scriptContext)->WindowsCreateStringReference(factoryName, factoryNameLen, &hStringHdr, &hString));
IfFailReturnNULL(GetWinRtFoundationLibrary(scriptContext)->RoGetActivationFactory(hString, factoryIID, &asyncCausalityTracerActivationFactory));
Assert(asyncCausalityTracerActivationFactory != NULL);
}
return asyncCausalityTracerActivationFactory;
}
IAsyncCausalityTracerStatics* WindowsFoundationAdapter::GetAsyncCausalityTracerStatics(_In_ ScriptContext* scriptContext)
{
if (! asyncCausalityTracerStatics)
{
IActivationFactory* factory = GetAsyncCausalityTracerActivationFactory(scriptContext);
if (!factory)
{
return NULL;
}
HRESULT hr;
IfFailReturnNULL(factory->QueryInterface(__uuidof(IAsyncCausalityTracerStatics), reinterpret_cast<void**>(&asyncCausalityTracerStatics)));
Assert(asyncCausalityTracerStatics != NULL);
}
return asyncCausalityTracerStatics;
}
HRESULT WindowsFoundationAdapter::TraceOperationCreation(
_In_ ScriptContext* scriptContext,
_In_ INT traceLevel,
_In_ INT source,
_In_ GUID platformId,
_In_ UINT64 operationId,
_In_z_ PCWSTR operationName,
_In_ UINT64 relatedContext)
{
HRESULT hr;
HSTRING hString;
HSTRING_HEADER hStringHdr;
Assert(traceLevel <= CausalityTraceLevel::CausalityTraceLevel_Verbose && traceLevel >= CausalityTraceLevel_Required);
Assert(source <= CausalitySource::CausalitySource_System && source >= CausalitySource_Application);
size_t operationNameLen = wcslen(operationName);
if (operationNameLen > UINT_MAX)
{
return E_OUTOFMEMORY;
}
IFFAILRET(GetWinRtStringLibrary(scriptContext)->WindowsCreateStringReference(operationName, static_cast<UINT32>(operationNameLen), &hStringHdr, &hString));
IAsyncCausalityTracerStatics* tracerStatics = GetAsyncCausalityTracerStatics(scriptContext);
if (!tracerStatics)
{
return E_UNEXPECTED;
}
return tracerStatics->TraceOperationCreation((CausalityTraceLevel)traceLevel, (CausalitySource)source, platformId, operationId, hString, relatedContext);
}
HRESULT WindowsFoundationAdapter::TraceOperationCompletion(
_In_ ScriptContext* scriptContext,
_In_ INT traceLevel,
_In_ INT source,
_In_ GUID platformId,
_In_ UINT64 operationId,
_In_ INT status)
{
Assert(traceLevel <= CausalityTraceLevel::CausalityTraceLevel_Verbose && traceLevel >= CausalityTraceLevel_Required);
Assert(source <= CausalitySource::CausalitySource_System && source >= CausalitySource_Application);
Assert(status <= (INT)AsyncStatus::Error && status >= (INT)AsyncStatus::Started);
IAsyncCausalityTracerStatics* tracerStatics = GetAsyncCausalityTracerStatics(scriptContext);
if (!tracerStatics)
{
return E_UNEXPECTED;
}
return tracerStatics->TraceOperationCompletion((CausalityTraceLevel)traceLevel, (CausalitySource)source, platformId, operationId, (AsyncStatus)status);
}
HRESULT WindowsFoundationAdapter::TraceOperationRelation(
_In_ ScriptContext* scriptContext,
_In_ INT traceLevel,
_In_ INT source,
_In_ GUID platformId,
_In_ UINT64 operationId,
_In_ INT relation)
{
Assert(traceLevel <= CausalityTraceLevel::CausalityTraceLevel_Verbose && traceLevel >= CausalityTraceLevel_Required);
Assert(source <= CausalitySource::CausalitySource_System && source >= CausalitySource_Application);
Assert(relation <= CausalityRelation::CausalityRelation_Error && relation >= CausalityRelation_AssignDelegate);
IAsyncCausalityTracerStatics* tracerStatics = GetAsyncCausalityTracerStatics(scriptContext);
if (!tracerStatics)
{
return E_UNEXPECTED;
}
return tracerStatics->TraceOperationRelation((CausalityTraceLevel)traceLevel, (CausalitySource)source, platformId, operationId, (CausalityRelation)relation);
}
HRESULT WindowsFoundationAdapter::TraceSynchronousWorkStart(
_In_ ScriptContext* scriptContext,
_In_ INT traceLevel,
_In_ INT source,
_In_ GUID platformId,
_In_ UINT64 operationId,
_In_ INT work)
{
Assert(traceLevel <= CausalityTraceLevel::CausalityTraceLevel_Verbose && traceLevel >= CausalityTraceLevel_Required);
Assert(source <= CausalitySource::CausalitySource_System && source >= CausalitySource_Application);
Assert(work <= CausalitySynchronousWork::CausalitySynchronousWork_Execution && work >= CausalitySynchronousWork_CompletionNotification);
IAsyncCausalityTracerStatics* tracerStatics = GetAsyncCausalityTracerStatics(scriptContext);
if (!tracerStatics)
{
return E_UNEXPECTED;
}
return tracerStatics->TraceSynchronousWorkStart((CausalityTraceLevel)traceLevel, (CausalitySource)source, platformId, operationId, (CausalitySynchronousWork)work);
}
HRESULT WindowsFoundationAdapter::TraceSynchronousWorkCompletion(
_In_ ScriptContext* scriptContext,
_In_ INT traceLevel,
_In_ INT source,
_In_ INT work)
{
Assert(traceLevel <= CausalityTraceLevel::CausalityTraceLevel_Verbose && traceLevel >= CausalityTraceLevel_Required);
Assert(source <= CausalitySource::CausalitySource_System && source >= CausalitySource_Application);
Assert(work <= CausalitySynchronousWork::CausalitySynchronousWork_Execution && work >= CausalitySynchronousWork_CompletionNotification);
IAsyncCausalityTracerStatics* tracerStatics = GetAsyncCausalityTracerStatics(scriptContext);
if (!tracerStatics)
{
return E_UNEXPECTED;
}
return tracerStatics->TraceSynchronousWorkCompletion((CausalityTraceLevel)traceLevel, (CausalitySource)source, (CausalitySynchronousWork)work);
}
}
#endif