private static void StatsSenderThread(string vmName)
        {
            DateTime utcNow    = DateTime.UtcNow;
            long     fromTicks = TimelineStatsSender.TicksInSeconds();

            while (true)
            {
                try
                {
                    TimelineStatsSender.sEventQueueMutex.WaitOne();
                    if (TimelineStatsSender.sEventQueue.Count <= 0)
                    {
                        TimelineStatsSender.sEventQueueMutex.ReleaseMutex();
                        Thread.Sleep(1000);
                    }
                    else
                    {
                        TimelineStatsSender.TimelineEvent timelineEvent = TimelineStatsSender.sEventQueue.Dequeue();
                        TimelineStatsSender.sEventQueueMutex.ReleaseMutex();
                        TimelineStatsSender.SendTimelineStats(timelineEvent.Time, timelineEvent.S1, timelineEvent.Ticks - fromTicks, timelineEvent.S2, timelineEvent.S3, "", "", "", "", "", "", utcNow, timelineEvent.Time, fromTicks, timelineEvent.Ticks, vmName);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Warning("Exception in sending timeline stats: " + ex.ToString());
                    Thread.Sleep(1000);
                }
            }
        }
 public static void HandleEngineBootEvent(string eventName)
 {
     if (SystemUtils.IsOSWinXP() || !RegistryManager.Instance.IsTimelineStats4Enabled)
     {
         return;
     }
     Logger.Info("TimelineStats: UpdateEngineBootState: " + eventName);
     TimelineStatsSender.TimelineEvent timelineEvent = new TimelineStatsSender.TimelineEvent("engine-boot", eventName, string.Empty, string.Empty);
     TimelineStatsSender.sEventQueue.Enqueue(timelineEvent);
 }