diff options
author | Brian Sullivan <briansul@microsoft.com> | 2019-04-29 14:15:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-29 14:15:31 -0700 |
commit | e3f602bb27a5798115a016b282ae6ab87c0decdc (patch) | |
tree | cdf1f6d984a733f3352827659b6b259183edcf8a /src/vm | |
parent | 6bca031ae0e612c5d9dbe350e435cce9d9d1919a (diff) | |
parent | 663ce255b2d236d1b8075f635a9d5b0d20b45c7a (diff) | |
download | coreclr-e3f602bb27a5798115a016b282ae6ab87c0decdc.tar.gz coreclr-e3f602bb27a5798115a016b282ae6ab87c0decdc.tar.bz2 coreclr-e3f602bb27a5798115a016b282ae6ab87c0decdc.zip |
Merge pull request #24283 from briansull/ibc-linux-new
Updated fixes for IBC profile data on Linux
Diffstat (limited to 'src/vm')
-rw-r--r-- | src/vm/ceeload.cpp | 97 | ||||
-rw-r--r-- | src/vm/ceeload.h | 5 | ||||
-rw-r--r-- | src/vm/ceemain.cpp | 8 | ||||
-rw-r--r-- | src/vm/corhost.cpp | 12 | ||||
-rw-r--r-- | src/vm/eventpipe.cpp | 51 | ||||
-rw-r--r-- | src/vm/eventpipe.h | 4 |
6 files changed, 108 insertions, 69 deletions
diff --git a/src/vm/ceeload.cpp b/src/vm/ceeload.cpp index af6204f4c0..fc9178655e 100644 --- a/src/vm/ceeload.cpp +++ b/src/vm/ceeload.cpp @@ -74,7 +74,6 @@ #include "peimagelayout.inl" #include "ildbsymlib.h" - #if defined(PROFILING_SUPPORTED) #include "profilermetadataemitvalidator.h" #endif @@ -11653,6 +11652,91 @@ static bool GetBasename(LPCWSTR _src, __out_ecount(dstlen) __out_z LPWSTR _dst, return true; } +static LPCWSTR s_pCommandLine = NULL; + +// Rerieve the full command line for the current process. +LPCWSTR GetManagedCommandLine() +{ + LIMITED_METHOD_CONTRACT; + return s_pCommandLine; +} + +void Append_Next_Item(LPWSTR* ppCursor, SIZE_T* pRemainingLen, LPCWSTR pItem, bool addSpace) +{ + // read the writeback args and setup pCursor and remainingLen + LPWSTR pCursor = *ppCursor; + SIZE_T remainingLen = *pRemainingLen; + + // Calculate the length of pItem + SIZE_T itemLen = wcslen(pItem); + + // Append pItem at pCursor + wcscpy_s(pCursor, remainingLen, pItem); + pCursor += itemLen; + remainingLen -= itemLen; + + // Also append a space after pItem, if requested + if (addSpace) + { + // Append a space at pCursor + wcscpy_s(pCursor, remainingLen, W(" ")); + pCursor += 1; + remainingLen -= 1; + } + + // writeback and update ppCursor and pRemainingLen + *ppCursor = pCursor; + *pRemainingLen = remainingLen; +} + +void SaveManagedCommandLine(LPCWSTR pwzAssemblyPath, int argc, LPCWSTR *argv) +{ + CONTRACTL + { + NOTHROW; + GC_NOTRIGGER; + MODE_ANY; + } + CONTRACTL_END; + + // Get the command line. + LPCWSTR osCommandLine = GetCommandLineW(); + +#ifndef FEATURE_PAL + // On Windows, osCommandLine contains the executable and all arguments. + s_pCommandLine = osCommandLine; +#else + // On UNIX, the PAL doesn't have the command line arguments, so we must build the command line. + // osCommandLine contains the full path to the executable. + SIZE_T commandLineLen = (wcslen(osCommandLine) + 1); + + // We will append pwzAssemblyPath to the 'corerun' osCommandLine + commandLineLen += (wcslen(pwzAssemblyPath) + 1); + + for (int i = 0; i < argc; i++) + { + commandLineLen += (wcslen(argv[i]) + 1); + } + commandLineLen++; // Add 1 for the null-termination + + // Allocate a new string for the command line. + LPWSTR pNewCommandLine = new WCHAR[commandLineLen]; + SIZE_T remainingLen = commandLineLen; + LPWSTR pCursor = pNewCommandLine; + + Append_Next_Item(&pCursor, &remainingLen, osCommandLine, true); + Append_Next_Item(&pCursor, &remainingLen, pwzAssemblyPath, true); + + for (int i = 0; i < argc; i++) + { + bool moreArgs = (i < (argc-1)); + Append_Next_Item(&pCursor, &remainingLen, argv[i], moreArgs); + } + + s_pCommandLine = pNewCommandLine; +#endif +} + static void ProfileDataAllocateScenarioInfo(ProfileEmitter * pEmitter, LPCSTR scopeName, GUID* pMvid) { CONTRACTL @@ -11681,7 +11765,16 @@ static void ProfileDataAllocateScenarioInfo(ProfileEmitter * pEmitter, LPCSTR sc // Allocate and initialize the scenario header section // { - LPCWSTR pCmdLine = GetCommandLineW(); + // Get the managed command line. + LPCWSTR pCmdLine = GetManagedCommandLine(); + + // If this process started as a service we won't havre a managed command line + if (pCmdLine == nullptr) + { + // Use the result from GetCommandLineW() instead + pCmdLine = GetCommandLineW(); + } + S_SIZE_T cCmdLine = S_SIZE_T(wcslen(pCmdLine)); cCmdLine += 1; if (cCmdLine.IsOverflow()) diff --git a/src/vm/ceeload.h b/src/vm/ceeload.h index 04d78c3b5c..407d96933c 100644 --- a/src/vm/ceeload.h +++ b/src/vm/ceeload.h @@ -3419,4 +3419,9 @@ struct VASigCookieEx : public VASigCookie const BYTE *m_pArgs; // pointer to first unfixed unmanaged arg }; +// Rerieve the full command line for the current process. +LPCWSTR GetManagedCommandLine(); +// Save the command line for the current process. +void SaveManagedCommandLine(LPCWSTR pwzAssemblyPath, int argc, LPCWSTR *argv); + #endif // !CEELOAD_H_ diff --git a/src/vm/ceemain.cpp b/src/vm/ceemain.cpp index 10216f58ec..e595e88868 100644 --- a/src/vm/ceemain.cpp +++ b/src/vm/ceemain.cpp @@ -770,8 +770,9 @@ void EEStartupHelper(COINITIEE fFlags) #ifndef CROSSGEN_COMPILE - -#ifdef FEATURE_PREJIT + // Cross-process named objects are not supported in PAL + // (see CorUnix::InternalCreateEvent - src/pal/src/synchobj/event.cpp.272) +#if defined(FEATURE_PREJIT) && !defined(FEATURE_PAL) // Initialize the sweeper thread. if (g_pConfig->GetZapBBInstr() != NULL) { @@ -785,7 +786,7 @@ void EEStartupHelper(COINITIEE fFlags) _ASSERTE(hBBSweepThread); g_BBSweep.SetBBSweepThreadHandle(hBBSweepThread); } -#endif // FEATURE_PREJIT +#endif // FEATURE_PREJIT && FEATURE_PAL #ifdef FEATURE_INTERPRETER Interpreter::Initialize(); @@ -2604,7 +2605,6 @@ INT32 GetLatchedExitCode (void) return LatchedExitCode; } - // --------------------------------------------------------------------------- // Impl for UtilLoadStringRC Callback: In VM, we let the thread decide culture // Return an int uniquely describing which language this thread is using for ui. diff --git a/src/vm/corhost.cpp b/src/vm/corhost.cpp index b42fc28a85..cbba60dc61 100644 --- a/src/vm/corhost.cpp +++ b/src/vm/corhost.cpp @@ -39,11 +39,6 @@ #include "dwreport.h" #endif // !FEATURE_PAL -#include "stringarraylist.h" -#ifdef FEATURE_PERFTRACING -#include "eventpipe.h" -#endif // FEATURE_PERFTRACING - #ifdef FEATURE_COMINTEROP #include "winrttypenameconverter.h" #endif @@ -343,10 +338,8 @@ void SetCommandLineArgs(LPCWSTR pwzAssemblyPath, int argc, LPCWSTR* argv) } CONTRACTL_END; - // Send the command line to EventPipe. -#ifdef FEATURE_PERFTRACING - EventPipe::SaveCommandLine(pwzAssemblyPath, argc, argv); -#endif // FEATURE_PERFTRACING + // Record the command line. + SaveManagedCommandLine(pwzAssemblyPath, argc, argv); // Send the command line to System.Environment. struct _gc @@ -475,7 +468,6 @@ HRESULT CorHost2::ExecuteAssembly(DWORD dwAppDomainId, } GCPROTECT_END(); - } UNINSTALL_UNWIND_AND_CONTINUE_HANDLER; diff --git a/src/vm/eventpipe.cpp b/src/vm/eventpipe.cpp index 3a13dbd0cf..04907561e5 100644 --- a/src/vm/eventpipe.cpp +++ b/src/vm/eventpipe.cpp @@ -19,6 +19,7 @@ #include "eventtracebase.h" #include "sampleprofiler.h" #include "win32threadpool.h" +#include "ceemain.h" #ifdef FEATURE_PAL #include "pal.h" @@ -33,7 +34,6 @@ EventPipeSession *EventPipe::s_pSession = NULL; EventPipeBufferManager *EventPipe::s_pBufferManager = NULL; EventPipeFile *EventPipe::s_pFile = NULL; EventPipeEventSource *EventPipe::s_pEventSource = NULL; -LPCWSTR EventPipe::s_pCommandLine = NULL; HANDLE EventPipe::s_fileSwitchTimerHandle = NULL; ULONGLONG EventPipe::s_lastFlushSwitchTime = 0; @@ -223,12 +223,6 @@ void EventPipe::Shutdown() delete s_pEventSource; s_pEventSource = NULL; - // On Windows, this is just a pointer to the return value from - // GetCommandLineW(), so don't attempt to free it. -#ifdef FEATURE_PAL - delete[] s_pCommandLine; - s_pCommandLine = NULL; -#endif } EventPipeSessionID EventPipe::Enable( @@ -380,7 +374,7 @@ void EventPipe::DisableInternal(EventPipeSessionID id, EventPipeProviderCallback SampleProfiler::Disable(); // Log the process information event. - s_pEventSource->SendProcessInfo(s_pCommandLine); + s_pEventSource->SendProcessInfo(GetManagedCommandLine()); // Log the runtime information event. ETW::InfoLog::RuntimeInformation(ETW::InfoLog::InfoStructs::Normal); @@ -890,47 +884,6 @@ StackWalkAction EventPipe::StackWalkCallback(CrawlFrame *pCf, StackContents *pDa return SWA_CONTINUE; } -void EventPipe::SaveCommandLine(LPCWSTR pwzAssemblyPath, int argc, LPCWSTR *argv) -{ - CONTRACTL - { - THROWS; - GC_TRIGGERS; - MODE_COOPERATIVE; - PRECONDITION(pwzAssemblyPath != NULL); - PRECONDITION(argc <= 0 || argv != NULL); - } - CONTRACTL_END; - - // Get the command line. - LPCWSTR osCommandLine = GetCommandLineW(); - -#ifndef FEATURE_PAL - // On Windows, osCommandLine contains the executable and all arguments. - s_pCommandLine = osCommandLine; -#else - // On UNIX, the PAL doesn't have the command line arguments, so we must build the command line. - // osCommandLine contains the full path to the executable. - SString commandLine(osCommandLine); - commandLine.Append((WCHAR)' '); - commandLine.Append(pwzAssemblyPath); - - for (int i = 0; i < argc; i++) - { - commandLine.Append((WCHAR)' '); - commandLine.Append(argv[i]); - } - - // Allocate a new string for the command line. - SIZE_T commandLineLen = commandLine.GetCount(); - WCHAR *pCommandLine = new WCHAR[commandLineLen + 1]; - wcsncpy(pCommandLine, commandLine.GetUnicode(), commandLineLen); - pCommandLine[commandLineLen] = '\0'; - - s_pCommandLine = pCommandLine; -#endif -} - EventPipeEventInstance *EventPipe::GetNextEvent() { CONTRACTL diff --git a/src/vm/eventpipe.h b/src/vm/eventpipe.h index c8094e34d0..ad0e84e2ad 100644 --- a/src/vm/eventpipe.h +++ b/src/vm/eventpipe.h @@ -330,9 +330,6 @@ public: // Get the managed call stack for the specified thread. static bool WalkManagedStackForThread(Thread *pThread, StackContents &stackContents); - // Save the command line for the current process. - static void SaveCommandLine(LPCWSTR pwzAssemblyPath, int argc, LPCWSTR *argv); - // Get next event. static EventPipeEventInstance *GetNextEvent(); @@ -399,7 +396,6 @@ private: static EventPipeBufferManager *s_pBufferManager; static EventPipeFile *s_pFile; static EventPipeEventSource *s_pEventSource; - static LPCWSTR s_pCommandLine; static HANDLE s_fileSwitchTimerHandle; static ULONGLONG s_lastFlushSwitchTime; }; |