/// <summary> /// The TaskExecutionModule is a the external view into a subsystem responsible for executing user /// tasks. The subsystem consists of TaskWorkerThread, TaskEngine, TaskExecutionState and EngineProxy. /// The engine thread passes the TaskExecutionState to the TEM which after the task finishes passes the /// results back via the engineCallback. /// </summary> internal TaskExecutionModule ( EngineCallback engineCallback, TaskExecutionModuleMode moduleMode, bool profileExecution ) { this.engineCallback = engineCallback; this.moduleMode = moduleMode; // By default start in breadthFirst traversal. This is done to gather enough work at the start of the build to get all the nodes at least working on something. this.breadthFirstTraversal = true; this.profileExecution = profileExecution; this.totalTaskTime = 0; // Get the node the TEM is running on, this is so the parent engine knows which node is requesting a traversal strategy change. nodeId = engineCallback.GetParentEngine().NodeId; SetBatchRequestSize(); // In singleproc mode the task execution module executes tasks on the engine thread. In multi proc mode a new thread is // created so the TEM can submit tasks to a worker queue which will run the tasks on a new thread. if (moduleMode != TaskExecutionModuleMode.SingleProcMode) { this.isRunningMultipleNodes = true; this.activeThreadCount = 0; this.overallThreadCount = 0; this.threadActiveCountEvent = new ManualResetEvent(false); this.threadOverallCountEvent = new ManualResetEvent(false); this.lastTaskActivity = 0; // Create a worker thread and make it the active node thread workerThread = new TaskWorkerThread(this, profileExecution); workerThread.ActivateThread(); } else { this.isRunningMultipleNodes = false; } }