summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm')
-rw-r--r--src/vm/ceeload.cpp90
-rw-r--r--src/vm/ceeload.h5
-rw-r--r--src/vm/ceemain.cpp8
-rw-r--r--src/vm/corhost.cpp11
-rw-r--r--src/vm/eventpipe.cpp51
-rw-r--r--src/vm/eventpipe.h4
6 files changed, 68 insertions, 101 deletions
diff --git a/src/vm/ceeload.cpp b/src/vm/ceeload.cpp
index 66b8d535ce..0de5dd4a53 100644
--- a/src/vm/ceeload.cpp
+++ b/src/vm/ceeload.cpp
@@ -74,6 +74,7 @@
#include "peimagelayout.inl"
#include "ildbsymlib.h"
+
#if defined(PROFILING_SUPPORTED)
#include "profilermetadataemitvalidator.h"
#endif
@@ -11652,91 +11653,6 @@ 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
@@ -11765,9 +11681,7 @@ static void ProfileDataAllocateScenarioInfo(ProfileEmitter * pEmitter, LPCSTR sc
// Allocate and initialize the scenario header section
//
{
- // Get the managed command line.
- LPCWSTR pCmdLine = GetManagedCommandLine();
-
+ LPCWSTR 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 407d96933c..04d78c3b5c 100644
--- a/src/vm/ceeload.h
+++ b/src/vm/ceeload.h
@@ -3419,9 +3419,4 @@ 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 e595e88868..10216f58ec 100644
--- a/src/vm/ceemain.cpp
+++ b/src/vm/ceemain.cpp
@@ -770,9 +770,8 @@ void EEStartupHelper(COINITIEE fFlags)
#ifndef CROSSGEN_COMPILE
- // 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)
+
+#ifdef FEATURE_PREJIT
// Initialize the sweeper thread.
if (g_pConfig->GetZapBBInstr() != NULL)
{
@@ -786,7 +785,7 @@ void EEStartupHelper(COINITIEE fFlags)
_ASSERTE(hBBSweepThread);
g_BBSweep.SetBBSweepThreadHandle(hBBSweepThread);
}
-#endif // FEATURE_PREJIT && FEATURE_PAL
+#endif // FEATURE_PREJIT
#ifdef FEATURE_INTERPRETER
Interpreter::Initialize();
@@ -2605,6 +2604,7 @@ 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 6487c52fca..b42fc28a85 100644
--- a/src/vm/corhost.cpp
+++ b/src/vm/corhost.cpp
@@ -39,6 +39,11 @@
#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
@@ -338,8 +343,10 @@ void SetCommandLineArgs(LPCWSTR pwzAssemblyPath, int argc, LPCWSTR* argv)
}
CONTRACTL_END;
- // Record the command line.
- SaveManagedCommandLine(pwzAssemblyPath, argc, argv);
+ // Send the command line to EventPipe.
+#ifdef FEATURE_PERFTRACING
+ EventPipe::SaveCommandLine(pwzAssemblyPath, argc, argv);
+#endif // FEATURE_PERFTRACING
// Send the command line to System.Environment.
struct _gc
diff --git a/src/vm/eventpipe.cpp b/src/vm/eventpipe.cpp
index 04907561e5..3a13dbd0cf 100644
--- a/src/vm/eventpipe.cpp
+++ b/src/vm/eventpipe.cpp
@@ -19,7 +19,6 @@
#include "eventtracebase.h"
#include "sampleprofiler.h"
#include "win32threadpool.h"
-#include "ceemain.h"
#ifdef FEATURE_PAL
#include "pal.h"
@@ -34,6 +33,7 @@ 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,6 +223,12 @@ 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(
@@ -374,7 +380,7 @@ void EventPipe::DisableInternal(EventPipeSessionID id, EventPipeProviderCallback
SampleProfiler::Disable();
// Log the process information event.
- s_pEventSource->SendProcessInfo(GetManagedCommandLine());
+ s_pEventSource->SendProcessInfo(s_pCommandLine);
// Log the runtime information event.
ETW::InfoLog::RuntimeInformation(ETW::InfoLog::InfoStructs::Normal);
@@ -884,6 +890,47 @@ 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 ad0e84e2ad..c8094e34d0 100644
--- a/src/vm/eventpipe.h
+++ b/src/vm/eventpipe.h
@@ -330,6 +330,9 @@ 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();
@@ -396,6 +399,7 @@ 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;
};