VirtualBox

Changeset 3224 in kBuild


Ignore:
Timestamp:
Apr 8, 2018 3:49:07 PM (7 years ago)
Author:
bird
Message:

kmk: Fixed a couple of bugs in mkWinChildcareWorkerThreadHandleSubmit that would cause it to lock up.

Location:
trunk/src/kmk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin.h

    r3195 r3224  
    150150#ifdef KBUILD_OS_WINDOWS
    151151extern int kmk_builtin_kSubmit(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned);
    152 extern int kSubmitSubProcGetResult(intptr_t pvUser, int *prcExit, int *piSigNo);
     152extern int kSubmitSubProcGetResult(intptr_t pvUser, int fBlock, int *prcExit, int *piSigNo);
    153153extern int kSubmitSubProcKill(intptr_t pvUser, int iSignal);
    154154extern void kSubmitSubProcCleanup(intptr_t pvUser);
  • trunk/src/kmk/kmkbuiltin/kSubmit.c

    r3200 r3224  
    11961196 * @returns 0 on success, -1 if ReadFile was restarted.
    11971197 * @param   pvUser              The worker instance.
     1198 * @param   fBlock              if we're to block waiting for the result or not.
    11981199 * @param   prcExit             Where to return the exit code.
    11991200 * @param   piSigNo             Where to return the signal number.
    12001201 */
    1201 int kSubmitSubProcGetResult(intptr_t pvUser, int *prcExit, int *piSigNo)
     1202int kSubmitSubProcGetResult(intptr_t pvUser, int fBlock, int *prcExit, int *piSigNo)
    12021203{
    12031204    PWORKERINSTANCE pWorker = (PWORKERINSTANCE)pvUser;
     
    12101211     */
    12111212    DWORD cbRead = 0;
    1212     if (GetOverlappedResult(pWorker->hPipe, &pWorker->OverlappedRead, &cbRead, TRUE))
     1213    if (GetOverlappedResult(pWorker->hPipe, &pWorker->OverlappedRead, &cbRead, fBlock ? TRUE : FALSE))
    12131214    {
    12141215        pWorker->cbResultRead += cbRead;
     
    12281229    {
    12291230        DWORD dwErr = GetLastError();
     1231        if (dwErr == ERROR_IO_INCOMPLETE && !fBlock)
     1232            return -1;
    12301233        kSubmitWinReadFailed(pCtx, pWorker, dwErr, "kSubmitSubProcGetResult/result");
    12311234    }
  • trunk/src/kmk/w32/winchildren.c

    r3205 r3224  
    23342334        assert(pChild->u.Submit.pStdErr);
    23352335        pChild->u.Submit.pStdOut->fHaveWrittenOut = FALSE;
    2336         ahHandles[cHandles++] = pChild->u.Submit.pStdOut->hPipeMine;
     2336        ahHandles[cHandles++] = pChild->u.Submit.pStdOut->hEvent;
    23372337        pChild->u.Submit.pStdErr->fHaveWrittenOut = FALSE;
    2338         ahHandles[cHandles++] = pChild->u.Submit.pStdErr->hPipeMine;
     2338        ahHandles[cHandles++] = pChild->u.Submit.pStdErr->hEvent;
    23392339    }
    23402340
     
    23472347        int   iSignal   = -1;
    23482348        DWORD dwStatus;
    2349         if (cHandles == 0)
     2349        if (cHandles == 1)
    23502350            dwStatus = WaitForSingleObject(ahHandles[0], INFINITE);
    23512351        else
     
    23582358                mkWinChildcareWorkerCatchOutput(pChild, pChild->u.Submit.pStdErr, FALSE /*fDraining*/);
    23592359        }
    2360         if (kSubmitSubProcGetResult((intptr_t)pvSubmitWorker, &iExitCode, &iSignal) == 0)
     2360        if (kSubmitSubProcGetResult((intptr_t)pvSubmitWorker, dwStatus == WAIT_OBJECT_0 /*fBlock*/, &iExitCode, &iSignal) == 0)
    23612361        {
    23622362            if (pChild->u.Submit.pStdOut)
Note: See TracChangeset for help on using the changeset viewer.

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