/// <summary> /// Shuts down all of the managed nodes permanently. /// </summary> public void ShutdownAllNodes() { bool nodeReuse = ComponentHost.BuildParameters.EnableNodeReuse; // To avoid issues with mismatched priorities not shutting // down all the nodes on exit, we will attempt to shutdown // all matching notes with and without the priroity bit set. // So precompute both versions of the handshake now. long hostHandshake = NodeProviderOutOfProc.GetHostHandshake(nodeReuse, enableLowPriority: false); long hostHandshakeWithLow = NodeProviderOutOfProc.GetHostHandshake(nodeReuse, enableLowPriority: true); ShutdownAllNodes( hostHandshake, hostHandshakeWithLow, NodeProviderOutOfProc.GetClientHandshake(), NodeContextTerminated); }
/// <summary> /// Shuts down all of the managed nodes permanently. /// </summary> public void ShutdownAllNodes() { // If no BuildParameters were specified for this build, // we must be trying to shut down idle nodes from some // other, completed build. If they're still around, // they must have been started with node reuse. bool nodeReuse = ComponentHost.BuildParameters?.EnableNodeReuse ?? true; // To avoid issues with mismatched priorities not shutting // down all the nodes on exit, we will attempt to shutdown // all matching nodes with and without the priority bit set. // This means we need both versions of the handshake. ShutdownAllNodes( NodeProviderOutOfProc.GetHostHandshake(nodeReuse, enableLowPriority: false), NodeProviderOutOfProc.GetHostHandshake(nodeReuse, enableLowPriority: true), NodeProviderOutOfProc.GetClientHandshake(), NodeContextTerminated); }
/// <summary> /// Instantiates a new MSBuild process acting as a child node. /// </summary> public bool CreateNode(int nodeId, INodePacketFactory factory, NodeConfiguration configuration) { ErrorUtilities.VerifyThrowArgumentNull(factory, "factory"); if (_nodeContexts.Count == ComponentHost.BuildParameters.MaxNodeCount) { ErrorUtilities.ThrowInternalError("All allowable nodes already created ({0}).", _nodeContexts.Count); return(false); } // Start the new process. We pass in a node mode with a node number of 1, to indicate that we // want to start up just a standard MSBuild out-of-proc node. // Note: We need to always pass /nodeReuse to ensure the value for /nodeReuse from msbuild.rsp // (next to msbuild.exe) is ignored. string commandLineArgs = $"/nologo /nodemode:1 /nodeReuse:{ComponentHost.BuildParameters.EnableNodeReuse.ToString().ToLower()} /low:{ComponentHost.BuildParameters.LowPriority.ToString().ToLower()}"; // Make it here. CommunicationsUtilities.Trace("Starting to acquire a new or existing node to establish node ID {0}...", nodeId); long hostHandShake = NodeProviderOutOfProc.GetHostHandshake(ComponentHost.BuildParameters.EnableNodeReuse, ComponentHost.BuildParameters.LowPriority); NodeContext context = GetNode(null, commandLineArgs, nodeId, factory, hostHandShake, NodeProviderOutOfProc.GetClientHandshake(), NodeContextTerminated); if (null != context) { _nodeContexts[nodeId] = context; // Start the asynchronous read. context.BeginAsyncPacketRead(); // Configure the node. context.SendData(configuration); return(true); } throw new BuildAbortedException(ResourceUtilities.FormatResourceStringStripCodeAndKeyword("CouldNotConnectToMSBuildExe", ComponentHost.BuildParameters.NodeExeLocation)); }
/// <summary> /// Returns the client handshake for this node endpoint /// </summary> protected override long GetClientHandshake() { return(NodeProviderOutOfProc.GetClientHandshake()); }
/// <summary> /// Returns the host handshake for this node endpoint /// </summary> protected override long GetHostHandshake() { return(NodeProviderOutOfProc.GetHostHandshake(_enableReuse, _lowPriority)); }