summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorBrian Sullivan <briansul@microsoft.com>2019-04-29 14:15:31 -0700
committerGitHub <noreply@github.com>2019-04-29 14:15:31 -0700
commite3f602bb27a5798115a016b282ae6ab87c0decdc (patch)
treecdf1f6d984a733f3352827659b6b259183edcf8a /src/vm
parent6bca031ae0e612c5d9dbe350e435cce9d9d1919a (diff)
parent663ce255b2d236d1b8075f635a9d5b0d20b45c7a (diff)
downloadcoreclr-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.cpp97
-rw-r--r--src/vm/ceeload.h5
-rw-r--r--src/vm/ceemain.cpp8
-rw-r--r--src/vm/corhost.cpp12
-rw-r--r--src/vm/eventpipe.cpp51
-rw-r--r--src/vm/eventpipe.h4
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;
};