本文整理汇总了C++中ThreadContext::GetFunctionBodyLock方法的典型用法代码示例。如果您正苦于以下问题:C++ ThreadContext::GetFunctionBodyLock方法的具体用法?C++ ThreadContext::GetFunctionBodyLock怎么用?C++ ThreadContext::GetFunctionBodyLock使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ThreadContext
的用法示例。
在下文中一共展示了ThreadContext::GetFunctionBodyLock方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: 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;
//.........这里部分代码省略.........