Changeset 3051 for trunk/src


Ignore:
Timestamp:
Jul 24, 2017, 12:59:59 PM (8 years ago)
Author:
bird
Message:

kmk,kWorker: More aggressive handling of --nice (and --priority) on windows.

Location:
trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kWorker/kWorker.c

    r3043 r3051  
    1112411124        else if (strcmp(argv[i], "--test") == 0)
    1112511125            return kwTestRun(argc - i - 1, &argv[i + 1]);
     11126        else if (strcmp(argv[i], "--priority") == 0)
     11127        {
     11128            i++;
     11129            if (i < argc)
     11130            {
     11131                char *pszEnd = NULL;
     11132                unsigned long uValue = strtoul(argv[i], &pszEnd, 16);
     11133                if (   *argv[i]
     11134                    && pszEnd != NULL
     11135                    && *pszEnd == '\0'
     11136                    && uValue >= 1
     11137                    && uValue <= 5)
     11138                {
     11139                    DWORD dwClass, dwPriority;
     11140                    switch (uValue)
     11141                    {
     11142                        case 1: dwClass = IDLE_PRIORITY_CLASS;         dwPriority = THREAD_PRIORITY_IDLE; break;
     11143                        case 2: dwClass = BELOW_NORMAL_PRIORITY_CLASS; dwPriority = THREAD_PRIORITY_BELOW_NORMAL; break;
     11144                        case 3: dwClass = NORMAL_PRIORITY_CLASS;       dwPriority = THREAD_PRIORITY_NORMAL; break;
     11145                        case 4: dwClass = HIGH_PRIORITY_CLASS;         dwPriority = 0xffffffff; break;
     11146                        case 5: dwClass = REALTIME_PRIORITY_CLASS;     dwPriority = 0xffffffff; break;
     11147                    }
     11148                    SetPriorityClass(GetCurrentProcess(), dwClass);
     11149                    if (dwPriority != 0xffffffff)
     11150                        SetThreadPriority(GetCurrentThread(), dwPriority);
     11151                }
     11152                else
     11153                    return kwErrPrintfRc(2, "Invalid --priority argument: %s\n", argv[i]);
     11154            }
     11155            else
     11156                return kwErrPrintfRc(2, "--priority takes an argument!\n");
     11157
     11158        }
    1112611159        else if (   strcmp(argv[i], "--help") == 0
    1112711160                 || strcmp(argv[i], "-h") == 0
    1112811161                 || strcmp(argv[i], "-?") == 0)
    1112911162        {
    11130             printf("usage: kWorker [--volatile dir] --pipe <pipe-handle>\n"
     11163            printf("usage: kWorker [--volatile dir] [--priority <1-5>] --pipe <pipe-handle>\n"
    1113111164                   "usage: kWorker <--help|-h>\n"
    1113211165                   "usage: kWorker <--version|-V>\n"
  • trunk/src/kmk/kmkbuiltin/kSubmit.c

    r3039 r3051  
    383383                {
    384384                    char        szHandleArg[32];
    385                     const char *apszArgs[6] =
     385                    extern int process_priority; /* main.c */
     386                    char        szPriorityArg[32];
     387                    const char *apszArgs[10];
     388                    int         cArgs = 0;
     389                    apszArgs[cArgs++] = szExecutable;
     390                    apszArgs[cArgs++] = "--pipe";
     391                    _snprintf(szHandleArg, sizeof(szHandleArg), "%p", hWorkerPipe);
     392                    apszArgs[cArgs++] = szHandleArg;
     393                    if (pVarVolatile)
    386394                    {
    387                         szExecutable, "--pipe", szHandleArg,
    388                         pVarVolatile ? "--volatile" : NULL, pVarVolatile ? pVarVolatile->value : NULL,
    389                         NULL
    390                     };
    391                     _snprintf(szHandleArg, sizeof(szHandleArg), "%p", hWorkerPipe);
     395                        apszArgs[cArgs++] = "--volatile";
     396                        apszArgs[cArgs++] = pVarVolatile->value;
     397                    }
     398                    if (process_priority != 0)
     399                    {
     400                        apszArgs[cArgs++] = "--priority";
     401                        _snprintf(szPriorityArg, sizeof(szPriorityArg), "%u", process_priority);
     402                        apszArgs[cArgs++] = szPriorityArg;
     403                    }
     404                    apszArgs[cArgs] = NULL;
    392405
    393406                    /*
  • trunk/src/kmk/main.c

    r3041 r3051  
    863863{
    864864# ifdef WINDOWS32
    865   DWORD dwPriority;
     865  DWORD dwClass, dwPriority;
     866
    866867  if (process_affinity)
    867868    if (!SetProcessAffinityMask (GetCurrentProcess (), process_affinity))
    868       fprintf (stderr, "warning: SetPriorityClass (,%#x) failed with last error %d\n",
     869      fprintf (stderr, "warning: SetProcessAffinityMask (,%#x) failed with last error %d\n",
    869870               process_affinity, GetLastError ());
    870871
     
    872873    {
    873874      case 0:     return;
    874       case 1:     dwPriority = IDLE_PRIORITY_CLASS; break;
    875       case 2:     dwPriority = BELOW_NORMAL_PRIORITY_CLASS; break;
    876       case 3:     dwPriority = NORMAL_PRIORITY_CLASS; break;
    877       case 4:     dwPriority = HIGH_PRIORITY_CLASS; break;
    878       case 5:     dwPriority = REALTIME_PRIORITY_CLASS; break;
     875      case 1:     dwClass = IDLE_PRIORITY_CLASS;         dwPriority = THREAD_PRIORITY_IDLE; break;
     876      case 2:     dwClass = BELOW_NORMAL_PRIORITY_CLASS; dwPriority = THREAD_PRIORITY_BELOW_NORMAL; break;
     877      case 3:     dwClass = NORMAL_PRIORITY_CLASS;       dwPriority = THREAD_PRIORITY_NORMAL; break;
     878      case 4:     dwClass = HIGH_PRIORITY_CLASS;         dwPriority = 0xffffffff; break;
     879      case 5:     dwClass = REALTIME_PRIORITY_CLASS;     dwPriority = 0xffffffff; break;
    879880      default:    fatal (NILF, _("invalid priority %d\n"), process_priority);
    880881    }
    881   if (!SetPriorityClass (GetCurrentProcess (), dwPriority))
     882  if (!SetPriorityClass (GetCurrentProcess (), dwClass))
    882883    fprintf (stderr, "warning: SetPriorityClass (,%#x) failed with last error %d\n",
     884             dwClass, GetLastError ());
     885  if (dwPriority != 0xffffffff
     886      && !SetThreadPriority (GetCurrentThread (), dwPriority))
     887    fprintf (stderr, "warning: SetThreadPriority (,%#x) failed with last error %d\n",
    883888             dwPriority, GetLastError ());
    884889
  • trunk/src/kmk/w32/subproc/sub_proc.c

    r2912 r3051  
    548548#ifdef KMK
    549549        size_t exec_path_len;
     550        extern int process_priority;
    550551
    551552        assert (pproc->enmType == kRegular);
     
    716717                else if (argv[0])
    717718                        kmk_cache_exec_image(argv[0]);
     719
     720                switch (process_priority) {
     721                case 1: flags |= CREATE_SUSPENDED | IDLE_PRIORITY_CLASS; break;
     722                case 2: flags |= CREATE_SUSPENDED | BELOW_NORMAL_PRIORITY_CLASS; break;
     723                case 3: flags |= CREATE_SUSPENDED | NORMAL_PRIORITY_CLASS; break;
     724                case 4: flags |= CREATE_SUSPENDED | HIGH_PRIORITY_CLASS; break;
     725                case 5: flags |= CREATE_SUSPENDED | REALTIME_PRIORITY_CLASS; break;
     726                }
    718727#endif
    719728                if (CreateProcess(
     
    741750                        return(-1);
    742751                }
     752#ifdef KMK
     753                switch (process_priority) {
     754                case 1: SetThreadPriority(procInfo.hThread, THREAD_PRIORITY_IDLE); break;
     755                case 2: SetThreadPriority(procInfo.hThread, THREAD_PRIORITY_BELOW_NORMAL); break;
     756                case 3: SetThreadPriority(procInfo.hThread, THREAD_PRIORITY_NORMAL); break;
     757                case 4: SetThreadPriority(procInfo.hThread, THREAD_PRIORITY_HIGHEST); break;
     758                case 5: SetThreadPriority(procInfo.hThread, THREAD_PRIORITY_TIME_CRITICAL); break;
     759                }
     760                ResumeThread(procInfo.hThread);
     761#endif
    743762        }
    744763
Note: See TracChangeset for help on using the changeset viewer.