static BOOL AttachProcess(HANDLE hmod) { if (!ThreadContextTLSEntry::InitializeProcess()) { return FALSE; } g_hInstance = hmod; AutoSystemInfo::SaveModuleFileName(hmod); #if defined(_M_IX86) && !defined(__clang__) // Enable SSE2 math functions in CRT if SSE2 is available #pragma prefast(suppress:6031, "We don't require SSE2, but will use it if available") _set_SSE2_enable(TRUE); #endif #ifdef ENABLE_TEST_HOOKS if (FAILED(OnChakraCoreLoaded())) { return FALSE; } #endif { CmdLineArgsParser parser; ConfigParser::ParseOnModuleLoad(parser, hmod); } #ifdef ENABLE_JS_ETW EtwTrace::Register(); #endif #ifdef VTUNE_PROFILING VTuneChakraProfile::Register(); #endif ValueType::Initialize(); ThreadContext::GlobalInitialize(); // Needed to make sure that only ChakraCore is loaded into the process // This is unnecessary on Linux since there aren't other flavors of // Chakra binaries that can be loaded into the process const char16 *engine = szChakraCoreLock; if (::FindAtom(szChakraLock) != 0) { AssertMsg(FALSE, "Expecting to load chakracore.dll but process already loaded chakra.dll"); Binary_Inconsistency_fatal_error(); } lockedDll = ::AddAtom(engine); AssertMsg(lockedDll, "Failed to lock chakracore.dll"); #ifdef ENABLE_BASIC_TELEMETRY g_TraceLoggingClient = NoCheckHeapNewStruct(TraceLoggingClient); #endif #ifdef DYNAMIC_PROFILE_STORAGE return DynamicProfileStorage::Initialize(); #else return TRUE; #endif }
LeakReport::UrlRecord * LeakReport::LogUrl(char16 const * url, void * globalObject) { UrlRecord * record = NoCheckHeapNewStruct(UrlRecord); size_t length = wcslen(url) + 1; // Add 1 for the NULL. char16* urlCopy = NoCheckHeapNewArray(char16, length); js_memcpy_s(urlCopy, (length - 1) * sizeof(char16), url, (length - 1) * sizeof(char16)); urlCopy[length - 1] = _u('\0'); record->url = urlCopy; #if _MSC_VER record->time = _time64(NULL); #else record->time = time(NULL); #endif record->tid = ::GetCurrentThreadId(); record->next = nullptr; record->scriptEngine = nullptr; record->globalObject = globalObject; AutoCriticalSection autocs(&s_cs); if (LeakReport::urlRecordHead == nullptr) { Assert(LeakReport::urlRecordTail == nullptr); LeakReport::urlRecordHead = record; LeakReport::urlRecordTail = record; } else { LeakReport::urlRecordTail->next = record; LeakReport::urlRecordTail = record; } return record; }