Ignore:
Timestamp:
Aug 29, 2016, 6:31:33 PM (9 years ago)
Author:
bird
Message:

kSubmit/kWorker: updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/kSubmit.c

    r2843 r2844  
    5252#ifdef KBUILD_OS_WINDOWS
    5353# include "sub_proc.h"
     54# include "quote_argv.h"
    5455#endif
    5556
     
    366367                if (pWorker->OverlappedRead.hEvent != NULL)
    367368                {
    368                     char        szHandleArg[16];
     369                    char        szHandleArg[32];
    369370                    const char *apszArgs[4] = { szExecutable, "--pipe", szHandleArg, NULL };
    370371                    _snprintf(szHandleArg, sizeof(szHandleArg), "%p", hWorkerPipe);
     
    557558                                      const char *pszCwd, uint32_t *pcbMsg)
    558559{
    559     size_t   i;
    560560    size_t   cbTmp;
     561    uint32_t i;
    561562    uint32_t cbMsg;
     563    uint32_t cArgs;
     564    uint32_t cEnvVars;
    562565    uint8_t *pbMsg;
    563566    uint8_t *pbCursor;
     567
     568    /*
     569     * Adjust input.
     570     */
     571    if (!pszExecutable)
     572        pszExecutable = papszArgs[0];
    564573
    565574    /*
     
    569578    cbMsg += sizeof("JOB");
    570579    cbMsg += strlen(pszExecutable) + 1;
    571 
     580    cbMsg += strlen(pszCwd) + 1;
     581
     582    cbMsg += sizeof(cArgs);
    572583    for (i = 0; papszArgs[i] != NULL; i++)
    573         cbMsg += strlen(papszArgs[i]) + 1;
    574     cbMsg += 1;
    575 
     584        cbMsg += 1 + strlen(papszArgs[i]) + 1;
     585    cArgs  = i;
     586
     587    cbMsg += sizeof(cArgs);
    576588    for (i = 0; papszEnvVars[i] != NULL; i++)
    577589        cbMsg += strlen(papszEnvVars[i]) + 1;
    578     cbMsg += 1;
    579 
    580     cbMsg += strlen(pszCwd) + 1;
     590    cEnvVars = i;
     591
    581592
    582593    /*
     
    594605    pbCursor += cbTmp;
    595606
     607    cbTmp = strlen(pszCwd) + 1;
     608    memcpy(pbCursor, pszCwd, cbTmp);
     609    pbCursor += cbTmp;
     610
     611    memcpy(pbCursor, &cArgs, sizeof(cArgs));
     612    pbCursor += sizeof(cArgs);
    596613    for (i = 0; papszArgs[i] != NULL; i++)
    597614    {
     615        *pbCursor++ = 0; /* Argument expansion flags (MSC, EMX). */
    598616        cbTmp = strlen(papszArgs[i]) + 1;
    599617        memcpy(pbCursor, papszArgs[i], cbTmp);
    600618        pbCursor += cbTmp;
    601619    }
    602     *pbCursor++ = '\0';
    603 
     620    assert(i == cArgs);
     621
     622    memcpy(pbCursor, &cEnvVars, sizeof(cEnvVars));
     623    pbCursor += sizeof(cEnvVars);
    604624    for (i = 0; papszEnvVars[i] != NULL; i++)
    605625    {
     
    608628        pbCursor += cbTmp;
    609629    }
    610     *pbCursor++ = '\0';
    611 
    612     cbTmp = strlen(pszCwd) + 1;
    613     memcpy(pbCursor, pszCwd, cbTmp);
    614     pbCursor += cbTmp;
     630    assert(i == cEnvVars);
    615631
    616632    assert(pbCursor - pbMsg == (size_t)cbMsg);
     
    780796/**
    781797 * Used by
    782  * @returns 0 if we got the whole result, -1 if I/O is pending, windows last
     798 * @returns 0 if we got the whole result, -1 if I/O is pending, and windows last
    783799 *          error on ReadFile failure.
    784800 * @param   pWorker             The worker instance.
     
    806822            DWORD dwErr = GetLastError();
    807823            if (dwErr == ERROR_IO_PENDING)
    808                 return 1;
    809             return kSubmitWinReadFailed(pWorker, GetLastError());
     824                return -1;
     825            return kSubmitWinReadFailed(pWorker, dwErr);
    810826        }
    811827
     
    849865    if (rc == -1)
    850866    {
    851         if (process_kmk_register_submit(pWorker->OverlappedRead.hEvent, (intptr_t)pWorker) == 0)
     867        if (process_kmk_register_submit(pWorker->OverlappedRead.hEvent, (intptr_t)pWorker, pPidSpawned) == 0)
    852868        { /* likely */ }
    853869        else
     
    873889     */
    874890    pWorker->pBusyWith = pChild;
     891#ifndef KBUILD_OS_WINDOWS
    875892    *pPidSpawned = pWorker->pid;
     893#endif
    876894
    877895    kSubmitListUnlink(&g_IdleList, pWorker);
     
    977995        PWORKERINSTANCE apWorkers[MAXIMUM_WAIT_OBJECTS];
    978996        HANDLE          ahHandles[MAXIMUM_WAIT_OBJECTS];
    979         DWORD           cHandles;
     997        DWORD           cHandles = 0;
    980998
    981999        for (pWorker = g_IdleList.pHead; pWorker != NULL; pWorker = pWorker->pNext)
     
    13291347
    13301348    papszEnv = pChild->environment;
    1331     if (papszEnv)
     1349    if (!papszEnv)
    13321350        pChild->environment = papszEnv = target_environment(pChild->file);
    13331351    cEnvVars = 0;
     
    14951513        if (pWorker)
    14961514        {
     1515#ifdef KBUILD_OS_WINDOWS
     1516            /* Quote the argv elements, but first we need unquoted pszExecute. */
     1517            char *pszFreeExec = NULL;
     1518            if (!pszExecutable)
     1519                pszExecutable = pszFreeExec = xstrdup(argv[0]);
     1520            quote_argv(argc, argv, fWatcomBrainDamage, 1 /*fFreeOrLeak*/);
     1521#endif
     1522
    14971523            rcExit = kSubmitSendJobMessage(pWorker, pvMsg, cbMsg, 0 /*fNoRespawning*/, cVerbosity);
    14981524            if (rcExit == 0)
     
    15021528                if (atexit(kSubmitAtExitCallback) == 0)
    15031529                    g_fAtExitRegistered = 1;
     1530
     1531#ifdef KBUILD_OS_WINDOWS
     1532            free(pszFreeExec);
     1533#endif
    15041534        }
    15051535        else
Note: See TracChangeset for help on using the changeset viewer.