private void MicroThreadCallbackEnd(object sender, SchedulerThreadEventArgs e)
 {
     long endTime = GetTicksFromStopwatch();
     int intervalCount;
     lock (threadExecutionIntervals)
     {
         List<TimeInterval> intervals = threadExecutionIntervals[e.ThreadId];
         intervals.Last().End(endTime);
         intervalCount = intervals.Count;
     }
     long jobId = GetMicrothreadJobIdFromThreadInfo(e.ThreadId, intervalCount);
     var jobInfo = new MicrothreadNotification(e.ThreadId, e.MicroThread.Id, jobId, endTime, MicrothreadNotification.NotificationType.JobEnded);
         
     lock (microthreadNotifications)
     {
         microthreadNotifications.Add(jobInfo);
     }
 }
 private void MicroThreadEnded(object sender, SchedulerThreadEventArgs e)
 {
     lock (buildStepResultsToSend)
     {
         buildStepResultsToSend.Add(e.MicroThread.Id);
     }
 }
        private void MicroThreadCallbackStart(object sender, SchedulerThreadEventArgs e)
        {
            TimeInterval timeInterval;
            int intervalCount;
            lock (threadExecutionIntervals)
            {
                List<TimeInterval> intervals = threadExecutionIntervals[e.ThreadId];
                if (intervals.Count > 0 && !intervals.Last().HasEnded)
                    throw new InvalidOperationException("Starting a new microthread on a thread still running another microthread.");

                timeInterval = new TimeInterval(GetTicksFromStopwatch());
                intervals.Add(timeInterval);
                intervalCount = intervals.Count;
            }

            // Rely on intervals.Count, so must be called after intervals.Add!
            long jobId = GetMicrothreadJobIdFromThreadInfo(e.ThreadId, intervalCount);
            var jobInfo = new MicrothreadNotification(e.ThreadId, e.MicroThread.Id, jobId, timeInterval.StartTime, MicrothreadNotification.NotificationType.JobStarted);

            lock (microthreadNotifications)
            {
                microthreadNotifications.Add(jobInfo);
            }
        }
 private void MicroThreadStarted(object sender, SchedulerThreadEventArgs e)
 {
     // Not useful anymore? Let's do nothing for the moment
 }