/// <summary> /// This function launches a new node given a node index /// </summary> private void LaunchNode(int nodeIndex) { EventWaitHandle nodeReadyEvent = null; string msbuildLocation = Path.Combine(locationOfMSBuildExe, "MSBuild.exe"); ErrorUtilities.VerifyThrow(File.Exists(msbuildLocation), "Msbuild.exe cannot be found at: " + msbuildLocation); bool exitedDueToError = true; try { NativeMethods.STARTUPINFO startInfo = new NativeMethods.STARTUPINFO(); startInfo.cb = Marshal.SizeOf(startInfo); uint dwCreationFlags = NativeMethods.NORMAL_PRIORITY_CLASS; if (!Engine.debugMode) { startInfo.hStdError = NativeMethods.InvalidHandle; startInfo.hStdInput = NativeMethods.InvalidHandle; startInfo.hStdOutput = NativeMethods.InvalidHandle; startInfo.dwFlags = NativeMethods.STARTF_USESTDHANDLES; dwCreationFlags |= NativeMethods.CREATE_NO_WINDOW; } NativeMethods.SECURITY_ATTRIBUTES pSec = new NativeMethods.SECURITY_ATTRIBUTES(); NativeMethods.SECURITY_ATTRIBUTES tSec = new NativeMethods.SECURITY_ATTRIBUTES(); pSec.nLength = Marshal.SizeOf(pSec); tSec.nLength = Marshal.SizeOf(tSec); NativeMethods.PROCESS_INFORMATION pInfo = new NativeMethods.PROCESS_INFORMATION(); string appName = msbuildLocation; // Repeat the executable name as the first token of the command line because the command line // parser logic expects it and will otherwise skip the first argument string cmdLine = msbuildLocation + " /nologo /oldom /nodemode:" + nodeData[nodeIndex].NodeNumber; NativeMethods.CreateProcess(appName, cmdLine, ref pSec, ref tSec, false, dwCreationFlags, NativeMethods.NullPtr, null, ref startInfo, out pInfo); nodeReadyEvent = new EventWaitHandle(false, EventResetMode.ManualReset, LocalNodeProviderGlobalNames.NodeActiveEventName(nodeData[nodeIndex].NodeNumber)); // Wait until the node is ready to process the requests if (nodeReadyEvent.WaitOne(launchTimeout, false)) { exitedDueToError = false; } } finally { // Dispose before losing scope nodeReadyEvent?.Close(); if (exitedDueToError) { nodeData[nodeIndex].CommunicationFailed = true; } } }
/// <summary> /// This function launches a new node given a node index /// </summary> private void LaunchNode(int nodeIndex) { EventWaitHandle nodeReadyEvent = null; string msbuildLocation = Path.Combine(locationOfMSBuildExe, "MSBuild.exe"); ErrorUtilities.VerifyThrow(File.Exists(msbuildLocation),"Msbuild.exe cannot be found at: "+msbuildLocation); bool exitedDueToError = true; try { NativeMethods.STARTUPINFO startInfo = new NativeMethods.STARTUPINFO(); startInfo.cb = Marshal.SizeOf(startInfo); uint dwCreationFlags = NativeMethods.NORMAL_PRIORITY_CLASS; if (!Engine.debugMode) { startInfo.hStdError = NativeMethods.InvalidHandle; startInfo.hStdInput = NativeMethods.InvalidHandle; startInfo.hStdOutput = NativeMethods.InvalidHandle; startInfo.dwFlags = NativeMethods.STARTF_USESTDHANDLES; dwCreationFlags = dwCreationFlags | NativeMethods.CREATE_NO_WINDOW; } NativeMethods.SECURITY_ATTRIBUTES pSec = new NativeMethods.SECURITY_ATTRIBUTES(); NativeMethods.SECURITY_ATTRIBUTES tSec = new NativeMethods.SECURITY_ATTRIBUTES(); pSec.nLength = Marshal.SizeOf(pSec); tSec.nLength = Marshal.SizeOf(tSec); NativeMethods.PROCESS_INFORMATION pInfo = new NativeMethods.PROCESS_INFORMATION(); string appName = msbuildLocation; // Repeat the executable name as the first token of the command line because the command line // parser logic expects it and will otherwise skip the first argument string cmdLine = msbuildLocation + " /nologo /oldom /nodemode:" + nodeData[nodeIndex].NodeNumber; NativeMethods.CreateProcess(appName, cmdLine, ref pSec, ref tSec, false, dwCreationFlags, NativeMethods.NullPtr, null, ref startInfo, out pInfo); nodeReadyEvent = new EventWaitHandle(false, EventResetMode.ManualReset, LocalNodeProviderGlobalNames.NodeActiveEventName(nodeData[nodeIndex].NodeNumber)); // Wait until the node is ready to process the requests if (nodeReadyEvent.WaitOne(launchTimeout, false)) { exitedDueToError = false; } } finally { // Dispose before losing scope if (nodeReadyEvent != null) { nodeReadyEvent.Close(); } if (exitedDueToError) { nodeData[nodeIndex].CommunicationFailed = true; } } }