void __stdcall jitStartup(ICorJitHost* jitHost) { g_jitHost = jitHost; // `jitStartup` may be called multiple times // when pre-jitting. We should not reinitialize // config values each time. if (!JitConfig.isInitialized()) { JitConfig.initialize(jitHost); } #if defined(PLATFORM_UNIX) jitstdout = procstdout(); #else if (jitstdout == nullptr) { int jitstdoutFd = _dup(_fileno(procstdout())); _setmode(jitstdoutFd, _O_TEXT); jitstdout = _fdopen(jitstdoutFd, "w"); assert(jitstdout != nullptr); } #endif #ifdef FEATURE_TRACELOGGING JitTelemetry::NotifyDllProcessAttach(); #endif Compiler::compStartup(); }
extern "C" void __stdcall jitStartup(ICorJitHost* jitHost) { if (g_jitInitialized) { return; } g_jitHost = jitHost; assert(!JitConfig.isInitialized()); JitConfig.initialize(jitHost); #if defined(PLATFORM_UNIX) jitstdout = procstdout(); #else if (jitstdout == nullptr) { int stdoutFd = _fileno(procstdout()); // Check fileno error output(s) -1 may overlap with errno result // but is included for completness. // We want to detect the case where the initial handle is null // or bogus and avoid making further calls. if ((stdoutFd != -1) && (stdoutFd != -2) && (errno != EINVAL)) { int jitstdoutFd = _dup(_fileno(procstdout())); // Check the error status returned by dup. if (jitstdoutFd != -1) { _setmode(jitstdoutFd, _O_TEXT); jitstdout = _fdopen(jitstdoutFd, "w"); assert(jitstdout != nullptr); // Prevent the FILE* from buffering its output in order to avoid calls to // `fflush()` throughout the code. setvbuf(jitstdout, nullptr, _IONBF, 0); } } } // If jitstdout is still null, fallback to whatever procstdout() was // initially set to. if (jitstdout == nullptr) { jitstdout = procstdout(); } #endif // PLATFORM_UNIX #ifdef FEATURE_TRACELOGGING JitTelemetry::NotifyDllProcessAttach(); #endif Compiler::compStartup(); g_jitInitialized = true; }
void jitShutdown(bool processIsTerminating) { if (!g_jitInitialized) { return; } Compiler::compShutdown(); if (jitstdout != procstdout()) { // When the process is terminating, the fclose call is unnecessary and is also prone to // crashing since the UCRT itself often frees the backing memory earlier on in the // termination sequence. if (!processIsTerminating) { fclose(jitstdout); } } #ifdef FEATURE_TRACELOGGING JitTelemetry::NotifyDllProcessDetach(); #endif g_jitInitialized = false; }
void jitShutdown() { Compiler::compShutdown(); if (jitstdout != procstdout()) { fclose(jitstdout); } #ifdef FEATURE_TRACELOGGING JitTelemetry::NotifyDllProcessDetach(); #endif }
extern "C" DLLEXPORT void __stdcall jitStartup(ICorJitHost* jitHost) { if (g_jitInitialized) { if (jitHost != g_jitHost) { // We normally don't expect jitStartup() to be invoked more than once. // (We check whether it has been called once due to an abundance of caution.) // However, during SuperPMI playback of MCH file, we need to JIT many different methods. // Each one carries its own environment configuration state. // So, we need the JIT to reload the JitConfig state for each change in the environment state of the // replayed compilations. // We do this by calling jitStartup with a different ICorJitHost, // and have the JIT re-initialize its JitConfig state when this happens. JitConfig.destroy(g_jitHost); JitConfig.initialize(jitHost); g_jitHost = jitHost; } return; } g_jitHost = jitHost; assert(!JitConfig.isInitialized()); JitConfig.initialize(jitHost); #ifdef DEBUG const wchar_t* jitStdOutFile = JitConfig.JitStdOutFile(); if (jitStdOutFile != nullptr) { jitstdout = _wfopen(jitStdOutFile, W("a")); assert(jitstdout != nullptr); } #endif // DEBUG #if !defined(_HOST_UNIX_) if (jitstdout == nullptr) { int stdoutFd = _fileno(procstdout()); // Check fileno error output(s) -1 may overlap with errno result // but is included for completness. // We want to detect the case where the initial handle is null // or bogus and avoid making further calls. if ((stdoutFd != -1) && (stdoutFd != -2) && (errno != EINVAL)) { int jitstdoutFd = _dup(_fileno(procstdout())); // Check the error status returned by dup. if (jitstdoutFd != -1) { _setmode(jitstdoutFd, _O_TEXT); jitstdout = _fdopen(jitstdoutFd, "w"); assert(jitstdout != nullptr); // Prevent the FILE* from buffering its output in order to avoid calls to // `fflush()` throughout the code. setvbuf(jitstdout, nullptr, _IONBF, 0); } } } #endif // !_HOST_UNIX_ // If jitstdout is still null, fallback to whatever procstdout() was // initially set to. if (jitstdout == nullptr) { jitstdout = procstdout(); } #ifdef FEATURE_TRACELOGGING JitTelemetry::NotifyDllProcessAttach(); #endif Compiler::compStartup(); g_jitInitialized = true; }