internal static void SendTimelineStats(
            DateTime timestamp,
            string evt,
            long duration,
            string s1,
            string s2,
            string s3,
            string s4,
            string s5,
            string s6,
            string s7,
            string s8,
            DateTime fromTimestamp,
            DateTime toTimestamp,
            long fromTicks,
            long toTicks,
            string vmName)
        {
            string timezone = TimeZone.CurrentTimeZone.DaylightName;
            string locale   = Thread.CurrentThread.CurrentCulture.Name;

            new Thread((ThreadStart)(() =>
            {
                TimelineStatsSender.sEventQueueMutex.WaitOne();
                Stats.SendTimelineStats(TimelineStatsSender.UtcToUnixTimestampSecs(timestamp), TimelineStatsSender.sSequenceNumber++, evt, duration, s1, s2, s3, s4, s5, s6, s7, s8, timezone, locale, TimelineStatsSender.UtcToUnixTimestampSecs(fromTimestamp), TimelineStatsSender.UtcToUnixTimestampSecs(toTimestamp), fromTicks, toTicks, vmName);
                TimelineStatsSender.sEventQueueMutex.ReleaseMutex();
            }))
            {
                IsBackground = true
            }.Start();
        }
        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 UIMain(string[] args)
 {
     ProcessUtils.LogParentProcessDetails();
     TimelineStatsSender.Init(MultiInstanceStrings.VmName);
     TimelineStatsSender.HandleEngineBootEvent(EngineStatsEvent.player_launched.ToString());
     Program.BstPlusDevicesInit();
     Opt.Instance.Parse(args);
     if (Opt.Instance.help)
     {
         Program.Usage();
     }
     Stats.SendFrontendStatusUpdate("frontend-launched", MultiInstanceStrings.VmName);
     if (!MultiInstanceUtils.VerifyVmId(MultiInstanceStrings.VmName))
     {
         Logger.Error("VmName {0} , not part of VmList {1} , Exiting Process", (object)MultiInstanceStrings.VmName, (object)RegistryManager.Instance.VmList.ToString());
         Environment.Exit(1);
     }
     Logger.InitVmInstanceName(MultiInstanceStrings.VmName);
     InputManagerProxy.SetUp();
     if (HyperV.Instance.HyperVStatus == HyperV.ReturnCodes.MicrosoftHyperV)
     {
         Logger.Error("Hyper-V enabled for non Hyper-V build, exiting");
         Environment.Exit(-5);
     }
     else
     {
         if (HyperV.Instance.HyperVStatus != HyperV.ReturnCodes.None)
         {
             Logger.Info("Non-microsoft Hyper-V may be active, continuing");
         }
         Program.SetupAndRunApplication(Opt.Instance);
     }
 }
 public TimelineEvent(string evt, string s1, string s2, string s3)
 {
     this.Time  = DateTime.UtcNow;
     this.Ticks = TimelineStatsSender.TicksInSeconds();
     this.Event = evt;
     this.S1    = s1;
     this.S2    = s2;
     this.S3    = s3;
 }
 internal static void Init(string vmName)
 {
     if (SystemUtils.IsOSWinXP())
     {
         Logger.Warning("TimelineStats: Not supported for WindowsXP");
     }
     else if (!RegistryManager.Instance.IsTimelineStats4Enabled)
     {
         Logger.Warning("TimelineStats are disabled.");
     }
     else
     {
         Logger.Info("TimelineStats: Initalizing: Staring thread.");
         new Thread((ThreadStart)(() => TimelineStatsSender.StatsSenderThread(vmName)))
         {
             IsBackground = true
         }.Start();
     }
 }
        private static void SetupAndRunApplication(Opt opt)
        {
            Program.CheckIfAlreadyRunning(Opt.Instance.h);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (!VMWindow.CheckAndroidFilesIntegrity())
            {
                Logger.Error("Android File Integrity check failed");
                Environment.Exit(-2);
            }
            TimelineStatsSender.HandleEngineBootEvent(EngineStatsEvent.android_file_integrity_passed.ToString());
            InputMapper.RegisterGuestBootLogsHandler();
            AndroidService.StartAsync();
            HTTPHandler.StartServer();
            Program.InitAudioLogger(Logger.GetHdLoggerCallback());
            VMWindow vmWindow = new VMWindow(opt.h, opt.w);

            Application.Run();
        }
 private static long TicksInSeconds()
 {
     return(TimelineStatsSender.GetTickCount64() / 1000L);
 }