/// <summary> /// Constructor /// </summary> public TaskHostTask(IElementLocation taskLocation, TaskLoggingContext taskLoggingContext, IBuildComponentHost buildComponentHost, IDictionary <string, string> taskHostParameters, LoadedType taskType #if FEATURE_APPDOMAIN , AppDomainSetup appDomainSetup #endif ) { ErrorUtilities.VerifyThrowInternalNull(taskType, "taskType"); _taskLocation = taskLocation; _taskLoggingContext = taskLoggingContext; _buildComponentHost = buildComponentHost; _taskType = taskType; #if FEATURE_APPDOMAIN _appDomainSetup = appDomainSetup; #endif _taskHostParameters = taskHostParameters; _packetFactory = new NodePacketFactory(); (this as INodePacketFactory).RegisterPacketHandler(NodePacketType.LogMessage, LogMessagePacket.FactoryForDeserialization, this); (this as INodePacketFactory).RegisterPacketHandler(NodePacketType.TaskHostTaskComplete, TaskHostTaskComplete.FactoryForDeserialization, this); (this as INodePacketFactory).RegisterPacketHandler(NodePacketType.NodeShutdown, NodeShutdown.FactoryForDeserialization, this); _packetReceivedEvent = new AutoResetEvent(false); _receivedPackets = new ConcurrentQueue <INodePacket>(); _taskHostLock = new Object(); _setParameters = new Dictionary <string, object>(); }
/// <summary> /// Reset the state of objects in the node manager which need to be reset between builds. /// </summary> public void ClearPerBuildState() { _packetFactory = new NodePacketFactory(); _nodeIdToProvider.Clear(); // because the inproc node is always 1 therefore when new nodes are requested we need to start at 2 _nextNodeId = _inprocNodeId + 1; }
/// <summary> /// Initializes the component. /// </summary> /// <param name="host">The component host.</param> public void InitializeComponent(IBuildComponentHost host) { this.ComponentHost = host; _nodeContexts = new Dictionary <HandshakeOptions, NodeContext>(); _nodeIdToPacketFactory = new Dictionary <int, INodePacketFactory>(); _nodeIdToPacketHandler = new Dictionary <int, INodePacketHandler>(); _activeNodes = new HashSet <int>(); _noNodesActiveEvent = new ManualResetEvent(true); _localPacketFactory = new NodePacketFactory(); (this as INodePacketFactory).RegisterPacketHandler(NodePacketType.LogMessage, LogMessagePacket.FactoryForDeserialization, this); (this as INodePacketFactory).RegisterPacketHandler(NodePacketType.TaskHostTaskComplete, TaskHostTaskComplete.FactoryForDeserialization, this); (this as INodePacketFactory).RegisterPacketHandler(NodePacketType.NodeShutdown, NodeShutdown.FactoryForDeserialization, this); }
/// <summary> /// Shuts down all of the managed nodes permanently. /// </summary> /// <param name="hostHandshake">host handshake key</param> /// <param name="hostHandshakeWithLowPriority">host handshake key with low priority added</param> /// <param name="clientHandshake">client handshake key</param> /// <param name="terminateNode">Delegate used to tell the node provider that a context has terminated</param> protected void ShutdownAllNodes(long hostHandshake, long hostHandshakeWithLowPriority, long clientHandshake, NodeContextTerminateDelegate terminateNode) { // INodePacketFactory INodePacketFactory factory = new NodePacketFactory(); List <Process> nodeProcesses = GetPossibleRunningNodes().nodeProcesses; // Find proper MSBuildTaskHost executable name string msbuildtaskhostExeName = NodeProviderOutOfProcTaskHost.TaskHostNameForClr2TaskHost; // Search for all instances of msbuildtaskhost process and add them to the process list nodeProcesses.AddRange(new List <Process>(Process.GetProcessesByName(Path.GetFileNameWithoutExtension(msbuildtaskhostExeName)))); // For all processes in the list, send signal to terminate if able to connect foreach (Process nodeProcess in nodeProcesses) { // A 2013 comment suggested some nodes take this long to respond, so a smaller timeout would miss nodes. int timeout = 30; // Attempt to connect to the process with the handshake without low priority. Stream nodeStream = TryConnectToProcess(nodeProcess.Id, timeout, hostHandshake, clientHandshake); if (null == nodeStream) { // If we couldn't connect attempt to connect to the process with the handshake including low priority. nodeStream = TryConnectToProcess(nodeProcess.Id, timeout, hostHandshakeWithLowPriority, clientHandshake); } if (null != nodeStream) { // If we're able to connect to such a process, send a packet requesting its termination CommunicationsUtilities.Trace("Shutting down node with pid = {0}", nodeProcess.Id); NodeContext nodeContext = new NodeContext(0, nodeProcess.Id, nodeStream, factory, terminateNode); nodeContext.SendData(new NodeBuildComplete(false /* no node reuse */)); nodeStream.Dispose(); } } }
/// <summary> /// Constructor. /// </summary> private NodeManager() { _nodeIdToProvider = new Dictionary <int, INodeProvider>(); _packetFactory = new NodePacketFactory(); _nextNodeId = _inprocNodeId + 1; }