Changeset 2844 for trunk/src/kmk


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

kSubmit/kWorker: updates

Location:
trunk/src/kmk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/Makefile.kmk

    r2843 r2844  
    8888        kmkbuiltin/setmode.c \
    8989        kmkbuiltin/strmode.c \
    90         kmkbuiltin/kbuild_version.c \
    9190        kmkbuiltin/kbuild_protection.c \
    9291        getopt.c \
  • trunk/src/kmk/job.c

    r2843 r2844  
    13181318      assert (*p2);
    13191319      set_command_state (child->file, cs_running);
     1320      child->deleted = 0;
    13201321      child->pid = 0;
    13211322      if (p2 != argv)
    1322         rc = kmk_builtin_command (*p2, &argv_spawn, &child->pid, child);
     1323        rc = kmk_builtin_command (*p2, child, &argv_spawn, &child->pid);
    13231324      else
    13241325        {
     
    13261327          while (argv[argc])
    13271328            argc++;
    1328           rc = kmk_builtin_command_parsed (argc, argv, &argv_spawn, &child->pid, child);
     1329          rc = kmk_builtin_command_parsed (argc, argv, child, &argv_spawn, &child->pid);
    13291330        }
    13301331
     
    13341335# endif
    13351336
    1336       /* synchronous command execution? */
    1337       if (!rc && !argv_spawn)
    1338         goto next_command;
    1339 
    1340       /* spawned a child? */
    1341       if (!rc && child->pid)
     1337      if (!rc)
    13421338        {
    1343           ++job_counter;
    1344           return;
     1339          /* spawned a child? */
     1340          if (child->pid)
     1341            {
     1342              ++job_counter;
     1343              return;
     1344            }
     1345
     1346          /* synchronous command execution? */
     1347          if (!argv_spawn)
     1348            goto next_command;
    13451349        }
    13461350
  • trunk/src/kmk/kmkbuiltin.h

    r2843 r2844  
    3535#endif
    3636
     37#include "kbuild_version.h"
     38
    3739int kmk_builtin_command(const char *pszCmd, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned);
    3840int kmk_builtin_command_parsed(int argc, char **argv, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned);
     
    6971extern char *kmk_builtin_func_printf(char *o, char **argv, const char *funcname);
    7072
    71 extern int kbuild_version(const char *);
    72 
    7373#endif
    7474
  • 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
  • trunk/src/kmk/w32/include/sub_proc.h

    r2843 r2844  
    4949EXTERN_DECL(int process_used_slots, (VOID_DECL));
    5050#ifdef KMK
    51 EXTERN_DECL(int process_kmk_register_submit, (HANDLE hEvent, intptr_t clue));
     51EXTERN_DECL(int process_kmk_register_submit, (HANDLE hEvent, intptr_t clue, pid_t *pPid));
    5252#endif
    5353
  • trunk/src/kmk/w32/subproc/sub_proc.c

    r2843 r2844  
    206206 * @param   hEvent              The event semaphore to wait on.
    207207 * @param   clue                The clue to base.
     208 * @param   pPid                Where to return the pid that job.c expects.
    208209 */
    209210int
    210 process_kmk_register_submit(HANDLE hEvent, intptr_t clue)
     211process_kmk_register_submit(HANDLE hEvent, intptr_t clue, pid_t *pPid)
    211212{
    212213        if (proc_index < MAXIMUM_WAIT_OBJECTS) {
     
    217218
    218219                proc_array[proc_index++] = pSubProc;
     220                *pPid = (HANDLE)pSubProc;
    219221                return 0;
    220222        }
Note: See TracChangeset for help on using the changeset viewer.