Exemplo n.º 1
0
        ///////////////////////////////////////////for client
        //start main loop
        public void mainflow()
        {
            if (shutdownval)
            {
                Environment.Exit(0);
            }

            settings.checkTimeSync();   //update changed time settings

            //internal sync
            if (settings.timeSync && !controller.wrong && !pause) //skip when xtu settings bad, or user request
            {
                controller.XTUdaemon(settings, checker);

                //1. check config
                controller.generateCLKlist(settings, checker); //before batchCheck
                settings.batchCheckFiles();                    //no need to save io here
                if (settings.checkPowerCFGFlag)
                {
                    controller.initPowerCFG(settings);
                    controller.forceApply = true;   //just in case
                }

                //2. apply settings(add app if dont exist)
                var currfg = checker.detectFgProc(settings);
                checker.autoCheckInsert(currfg, settings, controller);
                //controller.setProcNice(currfg, settings);
                controller.setPower(currfg, settings);

                //3. check throttle

                /*
                 *
                 *  per profile scheduling.
                 *
                 *  store intermediate values on settingsmanager.
                 *
                 *  on throttle:
                 *      cpuload 80%(tweakable)
                 *      -get median upto throttleSync(tweakable)
                 *
                 *  if app on the same profile throttles:
                 *      profile gets modified affecting other relevant apps.
                 *
                 *  if app is not in any profile:
                 *      monitor performance for throttleSync(tweakable) cycles and assign to closest one.
                 *
                 */


                /*current app info
                 *  1. skip if its not in list
                 *  2. which throttle mode
                 */

                //reset timers (except newlist does it internally)
                if (prev_currfg != null)
                {
                    if (currfg.Id != prev_currfg.Id)
                    {
                        settings.resetThrottleSync();
                        settings.resetResurSync();
                    }
                }
                prev_currfg = currfg;

                //current profile:
                int currprof = controller.checkInList(currfg, settings);

                //if app has a profile:
                if (currprof != -1)
                {
                    if (checker.isCurrentlyThrottling(settings, controller))
                    {
                        int mode = settings.throttleMode; //save mode
                        settings.throttleMode = 0;        //reset

                        //median limit
                        int limit      = (int)settings.newlist_median.configList["newlist_median"]; //ex) 50
                        int listcount  = settings.generatedCLK.configList.Count();                  //ex) 12
                        int indexlimit = listcount - listcount * limit / 100;                       //ex) 6

                        //new clk value for cpu throttle (newclk)
                        var gclklist = checker.sortedCLKlist(settings);
                        int newindex = gclklist.IndexOf(controller.getCLK(false));
                        if (newindex > indexlimit)
                        {
                            newindex--;                            //ensure 0 is the end(noindex is -1)
                        }
                        int newclk = gclklist.ElementAt(newindex); //clk value goes in

                        //new xtu value for gpu throttle (newxtu)
                        float newxtu = controller.getXTU();
                        if (newxtu > controller.getBaseXTU(settings))
                        {
                            newxtu -= 0.5f;
                        }

                        switch (mode)
                        {
                        case 0: break;

                        case 1:     //cpu
                            settings.programs_running_cfg_cpu.appendChanges(currprof, newclk);

                            break;

                        case 2:     //gpu
                            settings.programs_running_cfg_xtu.appendChanges(currprof, newxtu);


                            break;
                        }
                    }
                    if (checker.isViableForResurrect(settings, controller))
                    {
                        int mode = settings.resurrectMode;
                        settings.resurrectMode = 0;

                        //median limit
                        int limit      = (int)settings.newlist_median.configList["newlist_median"]; //ex) 50
                        int listcount  = settings.generatedCLK.configList.Count();                  //ex) 12
                        int indexlimit = listcount - listcount * limit / 100;                       //ex) 6

                        string name = controller.checkNameInList(currfg, settings);
                        switch (mode)
                        {
                        case 0: break;

                        case 1:
                            if (currprof > 0)
                            {
                                settings.special_programs.appendChanges(name, currprof - 1);
                            }
                            break;

                        case 2:
                            if (currprof < indexlimit)
                            {
                                settings.special_programs.appendChanges(name, currprof + 1);
                            }
                            break;
                        }
                    }
                }
            }
            settings.updateTimeSync();
            checker.resettick();
        }