本文整理汇总了C++中ThreadContext::GetScriptContextList方法的典型用法代码示例。如果您正苦于以下问题:C++ ThreadContext::GetScriptContextList方法的具体用法?C++ ThreadContext::GetScriptContextList怎么用?C++ ThreadContext::GetScriptContextList使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ThreadContext
的用法示例。
在下文中一共展示了ThreadContext::GetScriptContextList方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: PerformRundown
//
// Enumerate through all the script contexts in the process and log events
// for each function loaded. Depending on the argument, start or end events are logged.
// In particular, a rundown is needed for the 'Attach' scenario of profiling.
//
void EtwTrace::PerformRundown(bool start)
{
// Lock threadContext list during etw rundown
AutoCriticalSection autoThreadContextCs(ThreadContext::GetCriticalSection());
ThreadContext * threadContext = ThreadContext::GetThreadContextList();
if(start)
{
JS_ETW(EventWriteDCStartInit());
}
else
{
JS_ETW(EventWriteDCEndInit());
}
while(threadContext != nullptr)
{
// Take etw rundown lock on this thread context
AutoCriticalSection autoEtwRundownCs(threadContext->GetEtwRundownCriticalSection());
ScriptContext* scriptContext = threadContext->GetScriptContextList();
while(scriptContext != NULL)
{
if(scriptContext->IsClosed())
{
scriptContext = scriptContext->next;
continue;
}
if(start)
{
JS_ETW(EventWriteScriptContextDCStart(scriptContext));
if(scriptContext->GetSourceContextInfoMap() != nullptr)
{
scriptContext->GetSourceContextInfoMap()->Map( [=] (DWORD_PTR sourceContext, SourceContextInfo * sourceContextInfo)
{
if (sourceContext != Constants::NoHostSourceContext)
{
JS_ETW(LogSourceEvent(EventWriteSourceDCStart,
sourceContext,
scriptContext,
/* sourceFlags*/ 0,
sourceContextInfo->url));
}
});
}
}
else
{
JS_ETW(EventWriteScriptContextDCEnd(scriptContext));
if(scriptContext->GetSourceContextInfoMap() != nullptr)
{
scriptContext->GetSourceContextInfoMap()->Map( [=] (DWORD_PTR sourceContext, SourceContextInfo * sourceContextInfo)
{
if (sourceContext != Constants::NoHostSourceContext)
{
JS_ETW(LogSourceEvent(EventWriteSourceDCEnd,
sourceContext,
scriptContext,
/* sourceFlags*/ 0,
sourceContextInfo->url));
}
});
}
}
scriptContext->MapFunction([&start] (FunctionBody* body)
{
#if DYNAMIC_INTERPRETER_THUNK
if(body->HasInterpreterThunkGenerated())
{
if(start)
{
LogMethodInterpretedThunkEvent(EventWriteMethodDCStart, body);
}
else
{
LogMethodInterpretedThunkEvent(EventWriteMethodDCEnd, body);
}
}
#endif
#if ENABLE_NATIVE_CODEGEN
body->MapEntryPoints([&](int index, FunctionEntryPointInfo * entryPoint)
{
if(entryPoint->IsCodeGenDone())
{
if (start)
{
LogMethodNativeEvent(EventWriteMethodDCStart, body, entryPoint);
}
else
{
LogMethodNativeEvent(EventWriteMethodDCEnd, body, entryPoint);
//.........这里部分代码省略.........
示例2: WritePerfMap
void PerfTrace::WritePerfMap()
{
#if ENABLE_NATIVE_CODEGEN
// Lock threadContext list during etw rundown
AutoCriticalSection autoThreadContextCs(ThreadContext::GetCriticalSection());
ThreadContext * threadContext = ThreadContext::GetThreadContextList();
FILE * perfMapFile;
{
const size_t PERFMAP_FILENAME_MAX_LENGTH = 30;
char perfMapFilename[PERFMAP_FILENAME_MAX_LENGTH];
pid_t processId = getpid();
snprintf(perfMapFilename, PERFMAP_FILENAME_MAX_LENGTH, "/tmp/perf-%d.map", processId);
perfMapFile = fopen(perfMapFilename, "w");
if (perfMapFile == NULL) {
return;
}
}
while(threadContext != nullptr)
{
// Take etw rundown lock on this thread context
AutoCriticalSection autoEtwRundownCs(threadContext->GetFunctionBodyLock());
ScriptContext* scriptContext = threadContext->GetScriptContextList();
while(scriptContext != NULL)
{
if(scriptContext->IsClosed())
{
scriptContext = scriptContext->next;
continue;
}
scriptContext->MapFunction([=] (FunctionBody* body)
{
#if DYNAMIC_INTERPRETER_THUNK
if(body->HasInterpreterThunkGenerated())
{
const char16* functionName = body->GetExternalDisplayName();
fwprintf(perfMapFile, _u("%llX %llX %s(Interpreted)\n"),
body->GetDynamicInterpreterEntryPoint(),
body->GetDynamicInterpreterThunkSize(),
functionName);
}
#endif
#if ENABLE_NATIVE_CODEGEN
body->MapEntryPoints([&](int index, FunctionEntryPointInfo * entryPoint)
{
if(entryPoint->IsCodeGenDone())
{
const ExecutionMode jitMode = entryPoint->GetJitMode();
if (jitMode == ExecutionMode::SimpleJit)
{
fwprintf(perfMapFile, _u("%llX %llX %s(SimpleJIT)\n"),
entryPoint->GetNativeAddress(),
entryPoint->GetCodeSize(),
body->GetExternalDisplayName());
}
else
{
fwprintf(perfMapFile, _u("%llX %llX %s(FullJIT)\n"),
entryPoint->GetNativeAddress(),
entryPoint->GetCodeSize(),
body->GetExternalDisplayName());
}
}
});
body->MapLoopHeadersWithLock([&](uint loopNumber, LoopHeader* header)
{
header->MapEntryPoints([&](int index, LoopEntryPointInfo * entryPoint)
{
if(entryPoint->IsCodeGenDone())
{
const uint16 loopNumber = ((uint16)body->GetLoopNumberWithLock(header));
fwprintf(perfMapFile, _u("%llX %llX %s(Loop%u)\n"),
entryPoint->GetNativeAddress(),
entryPoint->GetCodeSize(),
body->GetExternalDisplayName(),
loopNumber+1);
}
});
});
#endif
});
scriptContext = scriptContext->next;
}
threadContext = threadContext->Next();
}
fflush(perfMapFile);
fclose(perfMapFile);
#endif
PerfTrace::mapsRequested = 0;
//.........这里部分代码省略.........