VirtualBox

Changeset 3169 in kBuild


Ignore:
Timestamp:
Mar 21, 2018 11:27:47 AM (7 years ago)
Author:
bird
Message:

kmk/win: Run kDepObj on worker thread.

Location:
trunk/src/kmk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/dir-nt-bird.c

    r3167 r3169  
    483483void nt_fullpath_cached(const char *pszPath, char *pszFull, size_t cbFull)
    484484{
    485     KFSLOOKUPERROR  enmError;
    486     PKFSOBJ         pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError);
    487     assert(GetCurrentThreadId() == g_idMainThread);
    488     if (pPathObj)
    489     {
    490         KSIZE off = pPathObj->cchParent;
    491         if (off > 0)
    492         {
    493             KSIZE offEnd = off + pPathObj->cchName;
    494             if (offEnd < cbFull)
    495             {
    496                 PKFSDIR pAncestor;
    497 
    498                 pszFull[offEnd] = '\0';
    499                 memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName);
    500 
    501                 for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent)
     485    if (GetCurrentThreadId() == g_idMainThread)
     486    {
     487        KFSLOOKUPERROR  enmError;
     488        PKFSOBJ         pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError);
     489        if (pPathObj)
     490        {
     491            KSIZE off = pPathObj->cchParent;
     492            if (off > 0)
     493            {
     494                KSIZE offEnd = off + pPathObj->cchName;
     495                if (offEnd < cbFull)
    502496                {
    503                     kHlpAssert(off > 1);
    504                     kHlpAssert(pAncestor != NULL);
    505                     kHlpAssert(pAncestor->Obj.cchName > 0);
    506                     pszFull[--off] = '/';
     497                    PKFSDIR pAncestor;
     498
     499                    pszFull[offEnd] = '\0';
     500                    memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName);
     501
     502                    for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent)
     503                    {
     504                        kHlpAssert(off > 1);
     505                        kHlpAssert(pAncestor != NULL);
     506                        kHlpAssert(pAncestor->Obj.cchName > 0);
     507                        pszFull[--off] = '/';
    507508#ifdef KFSCACHE_CFG_SHORT_NAMES
    508                     if (   pAncestor->Obj.pszName == pAncestor->Obj.pszShortName
    509                         || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)
     509                        if (   pAncestor->Obj.pszName == pAncestor->Obj.pszShortName
     510                            || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)
    510511#endif
    511                     {
    512                         off -= pAncestor->Obj.cchName;
    513                         kHlpAssert(pAncestor->Obj.cchParent == off);
    514                         memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
     512                        {
     513                            off -= pAncestor->Obj.cchName;
     514                            kHlpAssert(pAncestor->Obj.cchParent == off);
     515                            memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
     516                        }
     517#ifdef KFSCACHE_CFG_SHORT_NAMES
     518                        else
     519                        {
     520                            /*
     521                             * The long name constains a space, so use the alternative name instead.
     522                             * Most likely the alternative name differs in length, usually it's shorter,
     523                             * so we have to shift the part of the path we've already assembled
     524                             * accordingly.
     525                             */
     526                            KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName;
     527                            if (cchDelta != 0)
     528                            {
     529                                if ((KSIZE)(offEnd + cchDelta) >= cbFull)
     530                                    goto l_fallback;
     531                                memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off);
     532                                off    += cchDelta;
     533                                offEnd += cchDelta;
     534                            }
     535                            off -= pAncestor->Obj.cchShortName;
     536                            kHlpAssert(pAncestor->Obj.cchParent == off);
     537                            memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName);
     538                        }
     539#endif
    515540                    }
    516 #ifdef KFSCACHE_CFG_SHORT_NAMES
    517                     else
    518                     {
    519                         /*
    520                          * The long name constains a space, so use the alternative name instead.
    521                          * Most likely the alternative name differs in length, usually it's shorter,
    522                          * so we have to shift the part of the path we've already assembled
    523                          * accordingly.
    524                          */
    525                         KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName;
    526                         if (cchDelta != 0)
    527                         {
    528                             if ((KSIZE)(offEnd + cchDelta) >= cbFull)
    529                                 goto l_fallback;
    530                             memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off);
    531                             off    += cchDelta;
    532                             offEnd += cchDelta;
    533                         }
    534                         off -= pAncestor->Obj.cchShortName;
    535                         kHlpAssert(pAncestor->Obj.cchParent == off);
    536                         memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName);
    537                     }
    538 #endif
     541                    kFsCacheObjRelease(g_pFsCache, pPathObj);
     542                    return;
    539543                }
    540                 kFsCacheObjRelease(g_pFsCache, pPathObj);
    541                 return;
    542             }
    543         }
    544         else
    545         {
    546             if ((size_t)pPathObj->cchName + 1 < cbFull)
    547             {
    548                 /* Assume no spaces here. */
    549                 memcpy(pszFull, pPathObj->pszName, pPathObj->cchName);
    550                 pszFull[pPathObj->cchName] = '/';
    551                 pszFull[pPathObj->cchName + 1] = '\0';
    552 
    553                 kFsCacheObjRelease(g_pFsCache, pPathObj);
    554                 return;
    555             }
    556         }
    557 
    558         /* do fallback. */
     544            }
     545            else
     546            {
     547                if ((size_t)pPathObj->cchName + 1 < cbFull)
     548                {
     549                    /* Assume no spaces here. */
     550                    memcpy(pszFull, pPathObj->pszName, pPathObj->cchName);
     551                    pszFull[pPathObj->cchName] = '/';
     552                    pszFull[pPathObj->cchName + 1] = '\0';
     553
     554                    kFsCacheObjRelease(g_pFsCache, pPathObj);
     555                    return;
     556                }
     557            }
     558
     559            /* do fallback. */
    559560#ifdef KFSCACHE_CFG_SHORT_NAMES
    560561l_fallback:
    561562#endif
    562         kHlpAssertFailed();
    563         kFsCacheObjRelease(g_pFsCache, pPathObj);
     563            kHlpAssertFailed();
     564            kFsCacheObjRelease(g_pFsCache, pPathObj);
     565        }
    564566    }
    565567
  • trunk/src/kmk/kmkbuiltin.c

    r3168 r3169  
    3535#ifdef _MSC_VER
    3636# include <io.h>
     37#endif
     38#if defined(KBUILD_OS_WINDOWS) && defined(CONFIG_NEW_WIN_CHILDREN)
     39# include "makeint.h"
     40# include "job.h"
     41# include "w32/winchildren.h"
    3742#endif
    3843#include "kmkbuiltin/err.h"
     
    226231 * kmk built command.
    227232 */
    228 static struct KMKBUILTINENTRY
     233static const KMKBUILTINENTRY g_aBuiltins[] =
    229234{
    230     const char *pszName;
    231     size_t      cchName;
    232     union
    233     {
    234         uintptr_t uPfn;
    235 #define FN_SIG_MAIN             0
    236         int (* pfnMain)(int argc, char **argv, char **envp);
    237 #define FN_SIG_MAIN_SPAWNS      1
    238         int (* pfnMainSpawns)(int argc, char **argv, char **envp, struct child *pChild, pid_t *pPid);
    239 #define FN_SIG_MAIN_TO_SPAWN    2
    240         int (* pfnMainToSpawn)(int argc, char **argv, char **envp, char ***ppapszArgvToSpawn);
    241     } u;
    242     size_t      uFnSignature : 8;
    243     size_t      fMpSafe : 1;
    244     size_t      fNeedEnv : 1;
    245 } const g_aBuiltins[] =
    246 {
    247 #define BUILTIN_ENTRY(a_fn, a_uFnSignature, fMpSafe, fNeedEnv) \
    248     { &(#a_fn)[12], sizeof(#a_fn) - 12 - 1, \
    249        (uintptr_t)a_fn,                     a_uFnSignature,  fMpSafe, fNeedEnv }
     235#define BUILTIN_ENTRY(a_fn, a_sz, a_uFnSignature, fMpSafe, fNeedEnv) \
     236    {  { { sizeof(a_sz) - 1, a_sz, } }, \
     237       (uintptr_t)a_fn,                                 a_uFnSignature,   fMpSafe, fNeedEnv }
    250238
    251239    /* More frequently used commands: */
    252     BUILTIN_ENTRY(kmk_builtin_append,       FN_SIG_MAIN,            0, 0),
    253     BUILTIN_ENTRY(kmk_builtin_printf,       FN_SIG_MAIN,            0, 0),
    254     BUILTIN_ENTRY(kmk_builtin_echo,         FN_SIG_MAIN,            0, 0),
    255     BUILTIN_ENTRY(kmk_builtin_install,      FN_SIG_MAIN,            0, 0),
    256     BUILTIN_ENTRY(kmk_builtin_kDepObj,      FN_SIG_MAIN,            0, 0),
     240    BUILTIN_ENTRY(kmk_builtin_append,   "append",       FN_SIG_MAIN,            0, 0),
     241    BUILTIN_ENTRY(kmk_builtin_printf,   "printf",       FN_SIG_MAIN,            0, 0),
     242    BUILTIN_ENTRY(kmk_builtin_echo,     "echo",         FN_SIG_MAIN,            0, 0),
     243    BUILTIN_ENTRY(kmk_builtin_install,  "install",      FN_SIG_MAIN,            0, 0),
     244    BUILTIN_ENTRY(kmk_builtin_kDepObj,  "kDepObj",      FN_SIG_MAIN,            1, 0),
    257245#ifdef KBUILD_OS_WINDOWS
    258     BUILTIN_ENTRY(kmk_builtin_kSubmit,      FN_SIG_MAIN_SPAWNS,     0, 0),
    259 #endif
    260     BUILTIN_ENTRY(kmk_builtin_mkdir,        FN_SIG_MAIN,            0, 0),
    261     BUILTIN_ENTRY(kmk_builtin_mv,           FN_SIG_MAIN,            0, 0),
    262     BUILTIN_ENTRY(kmk_builtin_redirect,     FN_SIG_MAIN_SPAWNS,     0, 0),
    263     BUILTIN_ENTRY(kmk_builtin_rm,           FN_SIG_MAIN,            0, 0),
    264     BUILTIN_ENTRY(kmk_builtin_rmdir,        FN_SIG_MAIN,            0, 0),
    265     BUILTIN_ENTRY(kmk_builtin_test,         FN_SIG_MAIN_TO_SPAWN,   0, 0),
     246    BUILTIN_ENTRY(kmk_builtin_kSubmit,  "kSubmit",      FN_SIG_MAIN_SPAWNS,     0, 0),
     247#endif
     248    BUILTIN_ENTRY(kmk_builtin_mkdir,    "mkdir",        FN_SIG_MAIN,            0, 0),
     249    BUILTIN_ENTRY(kmk_builtin_mv,       "mv",           FN_SIG_MAIN,            0, 0),
     250    BUILTIN_ENTRY(kmk_builtin_redirect, "redirect",     FN_SIG_MAIN_SPAWNS,     0, 1),
     251    BUILTIN_ENTRY(kmk_builtin_rm,       "rm",           FN_SIG_MAIN,            0, 1),
     252    BUILTIN_ENTRY(kmk_builtin_rmdir,    "rmdir",        FN_SIG_MAIN,            0, 0),
     253    BUILTIN_ENTRY(kmk_builtin_test,     "test",         FN_SIG_MAIN_TO_SPAWN,   0, 0),
    266254    /* Less frequently used commands: */
    267     BUILTIN_ENTRY(kmk_builtin_kDepIDB,      FN_SIG_MAIN,            0, 0),
    268     BUILTIN_ENTRY(kmk_builtin_chmod,        FN_SIG_MAIN,            0, 0),
    269     BUILTIN_ENTRY(kmk_builtin_cp,           FN_SIG_MAIN,            0, 0),
    270     BUILTIN_ENTRY(kmk_builtin_expr,         FN_SIG_MAIN,            0, 0),
    271     BUILTIN_ENTRY(kmk_builtin_ln,           FN_SIG_MAIN,            0, 0),
    272     BUILTIN_ENTRY(kmk_builtin_md5sum,       FN_SIG_MAIN,            0, 0),
    273     BUILTIN_ENTRY(kmk_builtin_cmp,          FN_SIG_MAIN,            0, 0),
    274     BUILTIN_ENTRY(kmk_builtin_cat,          FN_SIG_MAIN,            0, 0),
    275     BUILTIN_ENTRY(kmk_builtin_touch,        FN_SIG_MAIN,            0, 0),
    276     BUILTIN_ENTRY(kmk_builtin_sleep,        FN_SIG_MAIN,            0, 0),
    277     BUILTIN_ENTRY(kmk_builtin_dircache,     FN_SIG_MAIN,            0, 0),
     255    BUILTIN_ENTRY(kmk_builtin_kDepIDB,  "kDepIDB",      FN_SIG_MAIN,            0, 0),
     256    BUILTIN_ENTRY(kmk_builtin_chmod,    "chmod",        FN_SIG_MAIN,            0, 0),
     257    BUILTIN_ENTRY(kmk_builtin_cp,       "cp",           FN_SIG_MAIN,            0, 1),
     258    BUILTIN_ENTRY(kmk_builtin_expr,     "expr",         FN_SIG_MAIN,            0, 0),
     259    BUILTIN_ENTRY(kmk_builtin_ln,       "ln",           FN_SIG_MAIN,            0, 0),
     260    BUILTIN_ENTRY(kmk_builtin_md5sum,   "md5sum",       FN_SIG_MAIN,            0, 0),
     261    BUILTIN_ENTRY(kmk_builtin_cmp,      "cmp",          FN_SIG_MAIN,            0, 0),
     262    BUILTIN_ENTRY(kmk_builtin_cat,      "cat",          FN_SIG_MAIN,            0, 0),
     263    BUILTIN_ENTRY(kmk_builtin_touch,    "touch",        FN_SIG_MAIN,            0, 0),
     264    BUILTIN_ENTRY(kmk_builtin_sleep,    "sleep",        FN_SIG_MAIN,            0, 0),
     265    BUILTIN_ENTRY(kmk_builtin_dircache, "dircache",     FN_SIG_MAIN,            0, 0),
    278266};
    279267
     
    289277    {
    290278        struct KMKBUILTINENTRY const *pEntry;
    291         size_t cchCmd;
    292         char ch0;
    293         int  cLeft;
     279        size_t cchAndStart;
     280        int    cLeft;
    294281
    295282        pszCmd += sizeof(s_szPrefix) - 1;
     283
     284        /*
     285         * Calc the length and start word to avoid calling memcmp/strcmp on each entry.
     286         */
     287#if K_ARCH_BITS != 64 && K_ARCH_BITS != 32
     288# error "PORT ME!"
     289#endif
     290        cchAndStart = strlen(pszCmd);
     291#if K_ENDIAN == K_ENDIAN_BIG
     292        cchAndStart <<= K_ARCH_BITS - 8;
     293        switch (cchAndStart)
     294        {
     295            default:                                   /* fall thru */
     296# if K_ARCH_BITS >= 64
     297            case 7: cchAndStart |= (size_t)pszCmd[6] << (K_ARCH_BITS - 56); /* fall thru */
     298            case 6: cchAndStart |= (size_t)pszCmd[5] << (K_ARCH_BITS - 48); /* fall thru */
     299            case 5: cchAndStart |= (size_t)pszCmd[4] << (K_ARCH_BITS - 40); /* fall thru */
     300            case 4: cchAndStart |= (size_t)pszCmd[3] << (K_ARCH_BITS - 32); /* fall thru */
     301# endif
     302            case 3: cchAndStart |= (size_t)pszCmd[2] << (K_ARCH_BITS - 24); /* fall thru */
     303            case 2: cchAndStart |= (size_t)pszCmd[1] << (K_ARCH_BITS - 16); /* fall thru */
     304            case 1: cchAndStart |= (size_t)pszCmd[0] << (K_ARCH_BITS -  8); /* fall thru */
     305            case 0: break;
     306        }
     307#else
     308        switch (cchAndStart)
     309        {
     310            default:                                   /* fall thru */
     311# if K_ARCH_BITS >= 64
     312            case 7: cchAndStart |= (size_t)pszCmd[6] << 56; /* fall thru */
     313            case 6: cchAndStart |= (size_t)pszCmd[5] << 48; /* fall thru */
     314            case 5: cchAndStart |= (size_t)pszCmd[4] << 40; /* fall thru */
     315            case 4: cchAndStart |= (size_t)pszCmd[3] << 32; /* fall thru */
     316# endif
     317            case 3: cchAndStart |= (size_t)pszCmd[2] << 24; /* fall thru */
     318            case 2: cchAndStart |= (size_t)pszCmd[1] << 16; /* fall thru */
     319            case 1: cchAndStart |= (size_t)pszCmd[0] <<  8; /* fall thru */
     320            case 0: break;
     321        }
     322#endif
    296323
    297324        /*
    298325         * Look up the builtin command in the table.
    299326         */
    300         cchCmd  = strlen(pszCmd);
    301         ch0     = *pszCmd;
    302327        pEntry  = &g_aBuiltins[0];
    303328        cLeft   = sizeof(g_aBuiltins) / sizeof(g_aBuiltins[0]);
    304329        while (cLeft-- > 0)
    305             if (   *pEntry->pszName != ch0
    306                 || pEntry->cchName != cchCmd
    307                 || memcmp(pEntry->pszName, pszCmd, cchCmd) != 0)
     330            if (   pEntry->uName.cchAndStart != cchAndStart
     331                || (   pEntry->uName.s.cch >= sizeof(cchAndStart)
     332                    && memcmp(pEntry->uName.s.sz, pszCmd, pEntry->uName.s.cch) != 0) )
    308333                pEntry++;
    309334            else
    310335            {
     336                /*
     337                 * That's a match!
     338                 */
    311339                int rc;
    312 #if defined(KBUILD_OS_WINDOWS) && CONFIG_NEW_WIN_CHILDREN
     340#if defined(KBUILD_OS_WINDOWS) && defined(CONFIG_NEW_WIN_CHILDREN)
    313341                if (pEntry->fMpSafe)
     342                    rc = MkWinChildCreateBuiltIn(pEntry, argc, argv, pEntry->fNeedEnv ? pChild->environment : NULL,
     343                                                 pChild, pPidSpawned);
     344                else
     345#endif
    314346                {
    315                     rc = 98;
    316                 }
    317                 else
    318 #endif
    319                 {
    320                     char **envp = environ; /** @todo fixme? */
     347                    char **envp = pChild->environment ? pChild->environment : environ;
    321348
    322349                    /*
     
    364391                return rc;
    365392            }
     393
     394        /*
     395         * No match! :-(
     396         */
    366397        fprintf(stderr, "kmk_builtin: Unknown command '%s%s'!\n", s_szPrefix, pszCmd);
    367398    }
  • trunk/src/kmk/kmkbuiltin.h

    r3159 r3169  
    6363int kmk_builtin_command_parsed(int argc, char **argv, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned);
    6464
     65/**
     66 * kmk built-in command entry.
     67 */
     68typedef struct KMKBUILTINENTRY
     69{
     70    union
     71    {
     72        struct
     73        {
     74            char    cch;
     75            char    sz[15];
     76        } s;
     77        size_t      cchAndStart;
     78    } uName;
     79    union
     80    {
     81        uintptr_t uPfn;
     82#define FN_SIG_MAIN             0
     83        int (* pfnMain)(int argc, char **argv, char **envp);
     84#define FN_SIG_MAIN_SPAWNS      1
     85        int (* pfnMainSpawns)(int argc, char **argv, char **envp, struct child *pChild, pid_t *pPid);
     86#define FN_SIG_MAIN_TO_SPAWN    2
     87        int (* pfnMainToSpawn)(int argc, char **argv, char **envp, char ***ppapszArgvToSpawn);
     88    } u;
     89    size_t      uFnSignature : 8;
     90    size_t      fMpSafe : 1;
     91    size_t      fNeedEnv : 1;
     92} KMKBUILTINENTRY;
     93/** Pointer to kmk built-in command entry. */
     94typedef KMKBUILTINENTRY const *PCKMKBUILTINENTRY;
     95
    6596extern int kmk_builtin_append(int argc, char **argv, char **envp);
    6697extern int kmk_builtin_cp(int argc, char **argv, char **envp);
  • trunk/src/kmk/w32/winchildren.c

    r3165 r3169  
    109109#ifdef KMK
    110110    /** kmkbuiltin command. */
    111     WINCHILDTYPE_BUILTIN,
     111    WINCHILDTYPE_BUILT_IN,
    112112    /** kSubmit job. */
    113113    WINCHILDTYPE_SUBMIT,
     
    175175            HANDLE          hProcess;
    176176        } Process;
     177
     178        /** Data for WINCHILDTYPE_BUILT_IN.   */
     179        struct
     180        {
     181            /** The built-in command. */
     182            PCKMKBUILTINENTRY pBuiltIn;
     183            /** Number of arguments. */
     184            int             cArgs;
     185            /** Argument vector (single allocation, strings following array). */
     186            char          **papszArgs;
     187            /** Environment vector.  Only a copy if fEnvIsCopy is set. */
     188            char          **papszEnv;
     189        } BuiltIn;
    177190
    178191        /** Data for WINCHILDTYPE_SUBMIT.   */
     
    16431656 * @param   pChild              The kSubmit child.
    16441657 */
    1645 static void mkWinChildcareWorkerThreadHandleBuiltin(PWINCHILDCAREWORKER pWorker, PWINCHILD pChild)
    1646 {
    1647     /** @todo later.    */
    1648 __debugbreak();
     1658static void mkWinChildcareWorkerThreadHandleBuiltIn(PWINCHILDCAREWORKER pWorker, PWINCHILD pChild)
     1659{
     1660    PCKMKBUILTINENTRY pBuiltIn = pChild->u.BuiltIn.pBuiltIn;
     1661    if (pBuiltIn->uFnSignature == FN_SIG_MAIN)
     1662        pChild->iExitCode = pBuiltIn->u.pfnMain(pChild->u.BuiltIn.cArgs, pChild->u.BuiltIn.papszArgs, pChild->u.BuiltIn.papszEnv);
     1663    else if (pBuiltIn->uFnSignature == FN_SIG_MAIN_SPAWNS)
     1664        pChild->iExitCode = pBuiltIn->u.pfnMainSpawns(pChild->u.BuiltIn.cArgs, pChild->u.BuiltIn.papszArgs,
     1665                                                      pChild->u.BuiltIn.papszEnv, pChild->pMkChild, NULL);
     1666    else
     1667    {
     1668        assert(0);
     1669        pChild->iExitCode = 98;
     1670    }
    16491671}
    16501672
     
    17601782                        break;
    17611783#ifdef KMK
    1762                     case WINCHILDTYPE_BUILTIN:
    1763                         mkWinChildcareWorkerThreadHandleBuiltin(pWorker, pChild);
     1784                    case WINCHILDTYPE_BUILT_IN:
     1785                        mkWinChildcareWorkerThreadHandleBuiltIn(pWorker, pChild);
    17641786                        break;
    17651787                    case WINCHILDTYPE_SUBMIT:
     
    19691991
    19701992#ifdef KMK
    1971 
    1972         case WINCHILDTYPE_BUILTIN:
    1973             assert(0);
     1993        case WINCHILDTYPE_BUILT_IN:
     1994            if (pChild->u.BuiltIn.papszArgs)
     1995            {
     1996                free(pChild->u.BuiltIn.papszArgs);
     1997                pChild->u.BuiltIn.papszArgs = NULL;
     1998            }
     1999            if (pChild->u.BuiltIn.papszEnv)
     2000            {
     2001                free(pChild->u.BuiltIn.papszEnv);
     2002                pChild->u.BuiltIn.papszEnv = NULL;
     2003            }
    19742004            break;
    19752005
     
    19892019            }
    19902020            break;
    1991 
    19922021#endif /* KMK */
    19932022
     
    22302259
    22312260/**
     2261 * Interface used by kmkbuiltin.c for executing builtin commands on threads.
     2262 *
     2263 * @returns 0 on success, windows status code on failure.
     2264 * @param   pBuiltIn        The kmk built-in command entry.
     2265 * @param   cArgs           The number of arguments in papszArgs.
     2266 * @param   papszArgs       The argument vector.
     2267 * @param   papszEnv        The environment vector, optional.
     2268 * @param   pMkChild        The make child structure.
     2269 * @param   pPid            Where to return the pid.
     2270 */
     2271int MkWinChildCreateBuiltIn(PCKMKBUILTINENTRY pBuiltIn, int cArgs, char **papszArgs, char **papszEnv,
     2272                            struct child *pMkChild, pid_t *pPid)
     2273{
     2274    size_t    cbIgnored;
     2275    PWINCHILD pChild = mkWinChildNew(WINCHILDTYPE_BUILT_IN);
     2276    pChild->pMkChild            = pMkChild;
     2277    pChild->u.BuiltIn.pBuiltIn  = pBuiltIn;
     2278    pChild->u.BuiltIn.cArgs     = cArgs;
     2279    pChild->u.BuiltIn.papszArgs = mkWinChildCopyStringArray(papszArgs, &cbIgnored);
     2280    pChild->u.BuiltIn.papszEnv  = papszEnv ? mkWinChildCopyStringArray(papszEnv, &cbIgnored) : NULL;
     2281    return mkWinChildPushToCareWorker(pChild, pPid);
     2282}
     2283
     2284/**
    22322285 * Interface used by kSubmit.c for registering stuff to wait on.
    22332286 *
     
    22992352                    break;
    23002353
    2301                 case WINCHILDTYPE_BUILTIN:
     2354                case WINCHILDTYPE_BUILT_IN:
    23022355                    break;
    23032356
     
    23642417            break;
    23652418#ifdef KMK
    2366         case WINCHILDTYPE_BUILTIN:
     2419        case WINCHILDTYPE_BUILT_IN:
    23672420            break;
    23682421        case WINCHILDTYPE_SUBMIT:
  • trunk/src/kmk/w32/winchildren.h

    r3159 r3169  
    2727#define INCLUDED_WINCHILDREN_H
    2828
    29 void    MkWinChildInit(unsigned int cJobSlot);
    30 void    MkWinChildReExecMake(char **papszArgs, char **papszEnv);
     29
     30void    MkWinChildInit(unsigned int cJobSlot);
     31void    MkWinChildReExecMake(char **papszArgs, char **papszEnv);
    3132intptr_t MkWinChildGetCompleteEventHandle(void);
    3233int     MkWinChildCreate(char **papszArgs, char **papszEnv, const char *pszShell, struct child *pMkChild, pid_t *pPid);
    3334int     MkWinChildCreateWithStdOutPipe(char **papszArgs, char **papszEnv, int fdErr, pid_t *pPid, int *pfdReadPipe);
     35#ifdef KMK
     36struct KMKBUILTINENTRY;
     37int     MkWinChildCreateBuiltIn(struct KMKBUILTINENTRY const *pBuiltIn, int cArgs, char **papszArgs,
     38                                char **papszEnv, struct child *pMkChild, pid_t *pPid);
    3439int     MkWinChildCreateSubmit(intptr_t hEvent, void *pvSubmitWorker, pid_t *pPid);
    3540int     MkWinChildCreateRedirect(intptr_t hProcess, pid_t *pPid);
     41#endif
    3642int     MkWinChildKill(pid_t pid, int iSignal, struct child *pMkChild);
    3743int     MkWinChildWait(int fBlock, pid_t *pPid, int *piExitCode, int *piSignal, int *pfCoreDumped, struct child **ppMkChild);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette