VirtualBox

Changeset 2915 in kBuild


Ignore:
Timestamp:
Sep 14, 2016 4:31:28 PM (8 years ago)
Author:
bird
Message:

kWorker: Fully buffered output to pipes and files too (for build box).

File:
1 edited

Legend:

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

    r2912 r2915  
    354354
    355355/**
    356  * Console line buffer.
     356 * Console line buffer or output full buffer.
    357357 */
    358358typedef struct KWCONSOLEOUTPUTLINE
     
    362362    /** Our backup handle. */
    363363    HANDLE              hBackup;
    364     /** Set if this is a console handle. */
     364    /** Set if this is a console handle and we're in line buffered mode.
     365     * When clear, we may buffer multiple lines, though try flush on line
     366     * boundraries when ever possible. */
    365367    KBOOL               fIsConsole;
    366     /** Amount of pending console output in wchar_t's. */
    367     KU32                cwcBuf;
    368     /** The allocated buffer size.   */
    369     KU32                cwcBufAlloc;
    370     /** Pending console output. */
    371     wchar_t            *pwcBuf;
     368    KU8                 abPadding[3];
     369    union
     370    {
     371        /** Line buffer mode (fIsConsole == K_TRUE). */
     372        struct
     373        {
     374            /** Amount of pending console output in wchar_t's. */
     375            KU32                cwcBuf;
     376            /** The allocated buffer size.   */
     377            KU32                cwcBufAlloc;
     378            /** Pending console output. */
     379            wchar_t            *pwcBuf;
     380        } Con;
     381        /** Fully buffered mode (fIsConsole == K_FALSE). */
     382        struct
     383        {
     384            /** Amount of pending output (in chars). */
     385            KU32                cchBuf;
     386            /** The allocated buffer size (in chars).   */
     387            KU32                cchBufAlloc;
     388            /** Pending output. */
     389            char               *pchBuf;
     390        } Fully;
     391    } u;
    372392} KWCONSOLEOUTPUTLINE;
    373393/** Pointer to a console line buffer. */
     
    51165136}
    51175137
     5138#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
     5139
     5140/**
     5141 * Write something to a handle, making sure everything is actually written.
     5142 *
     5143 * @param   hHandle         Where to write it to.
     5144 * @param   pchBuf          What to write
     5145 * @param   cchToWrite      How much to write.
     5146 */
     5147static void kwSandboxOutBufWriteIt(HANDLE hFile, char const *pchBuf, KU32 cchToWrite)
     5148{
     5149    if (cchToWrite > 0)
     5150    {
     5151        DWORD cchWritten = 0;
     5152        if (WriteFile(hFile, pchBuf, cchToWrite, &cchWritten, NULL))
     5153        {
     5154            if (cchWritten == cchToWrite)
     5155            { /* likely */ }
     5156            else
     5157            {
     5158                do
     5159                {
     5160                    pchBuf += cchWritten;
     5161                    cchToWrite -= cchWritten;
     5162                    cchWritten = 0;
     5163                } while (   cchToWrite > 0
     5164                         && WriteFile(hFile, pchBuf, cchToWrite, &cchWritten, NULL));
     5165            }
     5166        }
     5167        else
     5168            kHlpAssertFailed();
     5169    }
     5170}
     5171
     5172
     5173/**
     5174 * Worker for WriteFile when the output isn't going to the console.
     5175 *
     5176 * @param   pSandbox            The sandbox.
     5177 * @param   pOutBuf             The output buffer.
     5178 * @param   pchBuffer           What to write.
     5179 * @param   cchToWrite          How much to write.
     5180 */
     5181static void kwSandboxOutBufWrite(PKWSANDBOX pSandbox, PKWCONSOLEOUTPUTLINE pOutBuf, const char *pchBuffer, KU32 cchToWrite)
     5182{
     5183    if (pOutBuf->u.Fully.cchBufAlloc > 0)
     5184    { /* likely */ }
     5185    else
     5186    {
     5187        /* No realloc, max size is 64KB. */
     5188        pOutBuf->u.Fully.cchBufAlloc = 0x10000;
     5189        pOutBuf->u.Fully.pchBuf = (char *)kHlpAlloc(pOutBuf->u.Fully.cchBufAlloc);
     5190        if (!pOutBuf->u.Fully.pchBuf)
     5191        {
     5192            while (   !pOutBuf->u.Fully.pchBuf
     5193                   && pOutBuf->u.Fully.cchBufAlloc > 64)
     5194            {
     5195                pOutBuf->u.Fully.cchBufAlloc /= 2;
     5196                pOutBuf->u.Fully.pchBuf = (char *)kHlpAlloc(pOutBuf->u.Fully.cchBufAlloc);
     5197            }
     5198            if (!pOutBuf->u.Fully.pchBuf)
     5199            {
     5200                pOutBuf->u.Fully.cchBufAlloc = sizeof(pOutBuf->abPadding);
     5201                pOutBuf->u.Fully.pchBuf      = pOutBuf->abPadding;
     5202            }
     5203        }
     5204    }
     5205
     5206    /*
     5207     * Special case: Output ends with newline and fits in the buffer.
     5208     */
     5209    if (   cchToWrite > 1
     5210        && pchBuffer[cchToWrite - 1] == '\n'
     5211        && cchToWrite <= pOutBuf->u.Fully.cchBufAlloc - pOutBuf->u.Fully.cchBuf)
     5212    {
     5213        memcpy(&pOutBuf->u.Fully.pchBuf[pOutBuf->u.Fully.cchBuf], pchBuffer, cchToWrite);
     5214        pOutBuf->u.Fully.cchBuf += cchToWrite;
     5215    }
     5216    else
     5217    {
     5218        /*
     5219         * Work thru the text line by line, flushing the buffer when
     5220         * appropriate.  The buffer is not a line buffer here, it's a
     5221         * full buffer.
     5222         */
     5223        while (cchToWrite > 0)
     5224        {
     5225            char const *pchNewLine = (char *)memchr(pchBuffer, '\n', cchToWrite);
     5226            KU32        cchLine    = pchNewLine ? (KU32)(pchNewLine - pchBuffer) + 1 : cchToWrite;
     5227            if (cchLine <= pOutBuf->u.Fully.cchBufAlloc - pOutBuf->u.Fully.cchBuf)
     5228            {
     5229                memcpy(&pOutBuf->u.Fully.pchBuf[pOutBuf->u.Fully.cchBuf], pchBuffer, cchLine);
     5230                pOutBuf->u.Fully.cchBuf += cchLine;
     5231            }
     5232            /*
     5233             * Option one: Flush the buffer and the current line.
     5234             *
     5235             * We choose this one when the line won't ever fit, or when we have
     5236             * an incomplete line in the buffer.
     5237             */
     5238            else if (   cchLine >= pOutBuf->u.Fully.cchBufAlloc
     5239                     || pOutBuf->u.Fully.cchBuf == 0
     5240                     || pOutBuf->u.Fully.pchBuf[pOutBuf->u.Fully.cchBuf - 1] != '\n')
     5241            {
     5242                if (pOutBuf->u.Fully.cchBuf > 0)
     5243                {
     5244                    kwSandboxOutBufWriteIt(pOutBuf->hBackup, pOutBuf->u.Fully.pchBuf, pOutBuf->u.Fully.cchBuf);
     5245                    pOutBuf->u.Fully.cchBuf = 0;
     5246                }
     5247                kwSandboxOutBufWriteIt(pOutBuf->hBackup, pchBuffer, cchLine);
     5248            }
     5249            /*
     5250             * Option two: Only flush the lines in the buffer.
     5251             */
     5252            else
     5253            {
     5254                kwSandboxOutBufWriteIt(pOutBuf->hBackup, pOutBuf->u.Fully.pchBuf, pOutBuf->u.Fully.cchBuf);
     5255                memcpy(&pOutBuf->u.Fully.pchBuf[0], pchBuffer, cchLine);
     5256                pOutBuf->u.Fully.cchBuf = cchLine;
     5257            }
     5258
     5259            /* advance */
     5260            pchBuffer  += cchLine;
     5261            cchToWrite -= cchLine;
     5262        }
     5263    }
     5264}
     5265#endif  /* WITH_CONSOLE_OUTPUT_BUFFERING */
     5266
    51185267#ifdef WITH_TEMP_MEMORY_FILES
    51195268
     
    52725421            return TRUE;
    52735422        }
     5423        kwSandboxOutBufWrite(&g_Sandbox, pLineBuf, (const char *)pvBuffer, cbToWrite);
     5424        KWFS_LOG(("WriteFile(stdout/err) -> TRUE\n", hFile));
     5425        return TRUE;
    52745426    }
    52755427#endif
     
    58155967                    off += cwcWritten;
    58165968                    cwcWritten = 0;
    5817                 }
    5818                 while (   off < cwcToWrite
    5819                        && WriteConsoleW(pSandbox->Combined.hOutput, &pwcBuf[off], cwcToWrite - off, &cwcWritten, NULL));
     5969                } while (   off < cwcToWrite
     5970                         && WriteConsoleW(pSandbox->Combined.hOutput, &pwcBuf[off], cwcToWrite - off, &cwcWritten, NULL));
    58205971                kHlpAssert(off == cwcWritten);
    58215972            }
     
    58776028static void kwSandboxConsoleFinalFlushLineBuf(PKWSANDBOX pSandbox, PKWCONSOLEOUTPUTLINE pLineBuf)
    58786029{
    5879     if (pLineBuf->cwcBuf > 0)
    5880     {
    5881         if (pLineBuf->fIsConsole)
    5882         {
    5883             if (pLineBuf->cwcBuf < pLineBuf->cwcBufAlloc)
    5884             {
    5885                 pLineBuf->pwcBuf[pLineBuf->cwcBuf++] = '\n';
    5886                 kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->pwcBuf, pLineBuf->cwcBuf, K_FALSE /*fBrokenLine*/);
     6030    if (pLineBuf->fIsConsole)
     6031    {
     6032        if (pLineBuf->u.Con.cwcBuf > 0)
     6033        {
     6034            if (pLineBuf->u.Con.cwcBuf < pLineBuf->u.Con.cwcBufAlloc)
     6035            {
     6036                pLineBuf->u.Con.pwcBuf[pLineBuf->u.Con.cwcBuf++] = '\n';
     6037                kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->u.Con.pwcBuf, pLineBuf->u.Con.cwcBuf, K_FALSE /*fBrokenLine*/);
    58876038            }
    58886039            else
    58896040            {
    5890                 kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->pwcBuf, pLineBuf->cwcBuf, K_TRUE /*fBrokenLine*/);
     6041                kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->u.Con.pwcBuf, pLineBuf->u.Con.cwcBuf, K_TRUE /*fBrokenLine*/);
    58916042                kwSandboxConsoleAddToCombined(pSandbox, L"\n", 1, K_TRUE /*fBrokenLine*/);
    58926043            }
    5893             pLineBuf->cwcBuf = 0;
    5894         }
    5895         else
    5896         {
    5897             kHlpAssertFailed();
    5898         }
     6044            pLineBuf->u.Con.cwcBuf = 0;
     6045        }
     6046    }
     6047    else if (pLineBuf->u.Fully.cchBuf > 0)
     6048    {
     6049        kwSandboxOutBufWriteIt(pLineBuf->hBackup, pLineBuf->u.Fully.pchBuf, pLineBuf->u.Fully.cchBuf);
     6050        pLineBuf->u.Fully.cchBuf = 0;
    58996051    }
    59006052}
     
    59106062    /*
    59116063     * First do the cl.exe source file supression trick, if applicable.
     6064     * The output ends up on CONOUT$ if either StdOut or StdErr is a console
     6065     * handle.
    59126066     */
    5913     if (   pSandbox->Combined.cwcBuf >= 3
    5914         && pSandbox->StdOut.cwcBuf == 0
    5915         && pSandbox->StdErr.cwcBuf == 0
    5916         && pSandbox->Combined.cFlushes == 0
    5917         && pSandbox->pTool->u.Sandboxed.enmHint == KWTOOLHINT_VISUAL_CPP_CL)
    5918     {
    5919         KI32    off = pSandbox->Combined.cwcBuf - 1;
    5920         if (pSandbox->Combined.wszBuf[off] == '\n')
    5921         {
    5922             KBOOL fOk = K_TRUE;
    5923             while (off-- > 0)
    5924             {
    5925                 wchar_t const wc = pSandbox->Combined.wszBuf[off];
    5926                 if (iswalnum(wc) || wc == '.' || wc == ' ' || wc == '_' || wc == '-')
    5927                 { /* likely */ }
    5928                 else
     6067    if (   pSandbox->pTool->u.Sandboxed.enmHint == KWTOOLHINT_VISUAL_CPP_CL
     6068        && pSandbox->Combined.cFlushes == 0)
     6069    {
     6070        if (   pSandbox->StdOut.fIsConsole
     6071            || pSandbox->StdErr.fIsConsole)
     6072        {
     6073            if (   pSandbox->Combined.cwcBuf >= 3
     6074                && (pSandbox->StdOut.fIsConsole ? pSandbox->StdOut.u.Con.cwcBuf : pSandbox->StdOut.u.Fully.cchBuf) == 0
     6075                && (pSandbox->StdErr.fIsConsole ? pSandbox->StdErr.u.Con.cwcBuf : pSandbox->StdErr.u.Fully.cchBuf) == 0 )
     6076            {
     6077                KI32    off = pSandbox->Combined.cwcBuf - 1;
     6078                if (pSandbox->Combined.wszBuf[off] == '\n')
    59296079                {
    5930                     fOk = K_FALSE;
    5931                     break;
     6080                    KBOOL fOk = K_TRUE;
     6081                    while (off-- > 0)
     6082                    {
     6083                        wchar_t const wc = pSandbox->Combined.wszBuf[off];
     6084                        if (iswalnum(wc) || wc == '.' || wc == ' ' || wc == '_' || wc == '-')
     6085                        { /* likely */ }
     6086                        else
     6087                        {
     6088                            fOk = K_FALSE;
     6089                            break;
     6090                        }
     6091                    }
     6092                    if (fOk)
     6093                    {
     6094                        pSandbox->Combined.cwcBuf = 0;
     6095                        return;
     6096                    }
    59326097                }
    59336098            }
    5934             if (fOk)
    5935             {
    5936                 pSandbox->Combined.cwcBuf = 0;
    5937                 return;
     6099        }
     6100        /*
     6101         * Otherwise, it goes to standard error.
     6102         */
     6103        else if (   pSandbox->StdOut.u.Fully.cchBuf == 0
     6104                 && pSandbox->StdErr.u.Fully.cchBuf >= 3)
     6105        {
     6106            char const *pchBuf = pSandbox->StdErr.u.Fully.pchBuf;
     6107            KI32        off    = pSandbox->StdErr.u.Fully.cchBuf - 1;
     6108            kHlpAssert(pSandbox->Combined.cFlushes == 0 && pSandbox->Combined.cwcBuf == 0); /* unused! */
     6109
     6110            if (pchBuf[off] == '\n')
     6111            {
     6112                KBOOL fOk = K_TRUE;
     6113                if (pchBuf[off - 1] == '\r')
     6114                    off--;
     6115                while (off-- > 0)
     6116                {
     6117                    char const ch = pchBuf[off];
     6118                    if (isalnum(ch) || ch == '.' || ch == ' ' || ch == '_' || ch == '-')
     6119                    { /* likely */ }
     6120                    else
     6121                    {
     6122                        fOk = K_FALSE;
     6123                        break;
     6124                    }
     6125                }
     6126                if (fOk)
     6127                {
     6128                    pSandbox->StdErr.u.Fully.cchBuf = 0;
     6129                    return;
     6130                }
    59386131            }
    59396132        }
     
    59596152static void kwSandboxConsoleWriteW(PKWSANDBOX pSandbox, PKWCONSOLEOUTPUTLINE pLineBuf, wchar_t const *pwcBuffer, KU32 cwcToWrite)
    59606153{
     6154    kHlpAssert(pLineBuf->fIsConsole);
    59616155    if (cwcToWrite > 0)
    59626156    {
     
    59766170        {
    59776171            /* Need to grow the line buffer? */
    5978             KU32 cwcNeeded = offLastIncompleteLine != 0 ? offLastIncompleteLine : cchLastIncompleteLine + pLineBuf->cwcBuf;
    5979             if (cwcNeeded > pLineBuf->cwcBufAlloc)
     6172            KU32 cwcNeeded = offLastIncompleteLine != 0 ? offLastIncompleteLine : cchLastIncompleteLine + pLineBuf->u.Con.cwcBuf;
     6173            if (cwcNeeded > pLineBuf->u.Con.cwcBufAlloc)
    59806174            {
    59816175                void *pvNew;
    5982                 KU32  cwcNew = !pLineBuf->cwcBufAlloc ? 1024 : pLineBuf->cwcBufAlloc * 2;
     6176                KU32  cwcNew = !pLineBuf->u.Con.cwcBufAlloc ? 1024 : pLineBuf->u.Con.cwcBufAlloc * 2;
    59836177                while (cwcNew < cwcNeeded)
    59846178                    cwcNew *= 2;
    5985                 pvNew = kHlpRealloc(pLineBuf->pwcBuf, cwcNew * sizeof(wchar_t));
     6179                pvNew = kHlpRealloc(pLineBuf->u.Con.pwcBuf, cwcNew * sizeof(wchar_t));
    59866180                if (pvNew)
    59876181                {
    5988                     pLineBuf->pwcBuf = (wchar_t *)pvNew;
    5989                     pLineBuf->cwcBufAlloc = cwcNew;
     6182                    pLineBuf->u.Con.pwcBuf = (wchar_t *)pvNew;
     6183                    pLineBuf->u.Con.cwcBufAlloc = cwcNew;
    59906184                }
    59916185                else
    59926186                {
    5993                     pvNew = kHlpRealloc(pLineBuf->pwcBuf, cwcNeeded * sizeof(wchar_t));
     6187                    pvNew = kHlpRealloc(pLineBuf->u.Con.pwcBuf, cwcNeeded * sizeof(wchar_t));
    59946188                    if (pvNew)
    59956189                    {
    5996                         pLineBuf->pwcBuf = (wchar_t *)pvNew;
    5997                         pLineBuf->cwcBufAlloc = cwcNeeded;
     6190                        pLineBuf->u.Con.pwcBuf = (wchar_t *)pvNew;
     6191                        pLineBuf->u.Con.cwcBufAlloc = cwcNeeded;
    59986192                    }
    59996193                    else
    60006194                    {
    60016195                        /* This isn't perfect, but it will have to do for now. */
    6002                         if (pLineBuf->cwcBuf > 0)
     6196                        if (pLineBuf->u.Con.cwcBuf > 0)
    60036197                        {
    6004                             kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->pwcBuf, pLineBuf->cwcBuf, K_TRUE /*fBrokenLine*/);
    6005                             pLineBuf->cwcBuf = 0;
     6198                            kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->u.Con.pwcBuf, pLineBuf->u.Con.cwcBuf,
     6199                                                          K_TRUE /*fBrokenLine*/);
     6200                            pLineBuf->u.Con.cwcBuf = 0;
    60066201                        }
    60076202                        kwSandboxConsoleAddToCombined(pSandbox, pwcBuffer, cwcToWrite, K_TRUE /*fBrokenLine*/);
     
    60166211            if (offLastIncompleteLine == 0)
    60176212            {
    6018                 memcpy(&pLineBuf->pwcBuf[pLineBuf->cwcBuf], pwcBuffer, cwcToWrite * sizeof(wchar_t));
    6019                 pLineBuf->cwcBuf += cwcToWrite;
     6213                memcpy(&pLineBuf->u.Con.pwcBuf[pLineBuf->u.Con.cwcBuf], pwcBuffer, cwcToWrite * sizeof(wchar_t));
     6214                pLineBuf->u.Con.cwcBuf += cwcToWrite;
    60206215                return;
    60216216            }
     
    60256220         * If there is sufficient combined buffer to handle this request, this are rather simple.
    60266221         */
    6027         if (pLineBuf->cwcBuf + cchLastIncompleteLine <= K_ELEMENTS(pSandbox->Combined.wszBuf))
    6028         {
    6029             if (pLineBuf->cwcBuf > 0)
     6222        if (pLineBuf->u.Con.cwcBuf + cchLastIncompleteLine <= K_ELEMENTS(pSandbox->Combined.wszBuf))
     6223        {
     6224            if (pLineBuf->u.Con.cwcBuf > 0)
    60306225            {
    60316226                memcpy(&pSandbox->Combined.wszBuf[pSandbox->Combined.cwcBuf],
    6032                        pLineBuf->pwcBuf, pLineBuf->cwcBuf * sizeof(wchar_t));
    6033                 pSandbox->Combined.cwcBuf += pLineBuf->cwcBuf;
    6034                 pLineBuf->cwcBuf = 0;
     6227                       pLineBuf->u.Con.pwcBuf, pLineBuf->u.Con.cwcBuf * sizeof(wchar_t));
     6228                pSandbox->Combined.cwcBuf += pLineBuf->u.Con.cwcBuf;
     6229                pLineBuf->u.Con.cwcBuf = 0;
    60356230            }
    60366231
     
    60506245            /* If there is buffered chars, we handle the first line outside the
    60516246               main loop.  We must try our best outputting it as a complete line. */
    6052             if (pLineBuf->cwcBuf > 0)
     6247            if (pLineBuf->u.Con.cwcBuf > 0)
    60536248            {
    60546249                while (offNextLine < cwcToWrite && pwcBuffer[offNextLine] != '\n')
     
    60576252                kHlpAssert(offNextLine <= offLastIncompleteLine);
    60586253
    6059                 if (pLineBuf->cwcBuf + offNextLine + pSandbox->Combined.cwcBuf <= K_ELEMENTS(pSandbox->Combined.wszBuf))
     6254                if (pLineBuf->u.Con.cwcBuf + offNextLine + pSandbox->Combined.cwcBuf <= K_ELEMENTS(pSandbox->Combined.wszBuf))
    60606255                {
    60616256                    memcpy(&pSandbox->Combined.wszBuf[pSandbox->Combined.cwcBuf],
    6062                            pLineBuf->pwcBuf, pLineBuf->cwcBuf * sizeof(wchar_t));
    6063                     pSandbox->Combined.cwcBuf += pLineBuf->cwcBuf;
    6064                     pLineBuf->cwcBuf = 0;
     6257                           pLineBuf->u.Con.pwcBuf, pLineBuf->u.Con.cwcBuf * sizeof(wchar_t));
     6258                    pSandbox->Combined.cwcBuf += pLineBuf->u.Con.cwcBuf;
     6259                    pLineBuf->u.Con.cwcBuf = 0;
    60656260
    60666261                    memcpy(&pSandbox->Combined.wszBuf[pSandbox->Combined.cwcBuf], pwcBuffer, offNextLine * sizeof(wchar_t));
     
    60696264                else
    60706265                {
    6071                     KU32 cwcLeft = pLineBuf->cwcBufAlloc - pLineBuf->cwcBuf;
     6266                    KU32 cwcLeft = pLineBuf->u.Con.cwcBufAlloc - pLineBuf->u.Con.cwcBuf;
    60726267                    if (cwcLeft > 0)
    60736268                    {
    60746269                        KU32 cwcCopy = K_MIN(cwcLeft, offNextLine);
    6075                         memcpy(&pLineBuf->pwcBuf[pLineBuf->cwcBuf], pwcBuffer, cwcCopy * sizeof(wchar_t));
    6076                         pLineBuf->cwcBuf += cwcCopy;
     6270                        memcpy(&pLineBuf->u.Con.pwcBuf[pLineBuf->u.Con.cwcBuf], pwcBuffer, cwcCopy * sizeof(wchar_t));
     6271                        pLineBuf->u.Con.cwcBuf += cwcCopy;
    60776272                        off += cwcCopy;
    60786273                    }
    6079                     if (pLineBuf->cwcBuf > 0)
     6274                    if (pLineBuf->u.Con.cwcBuf > 0)
    60806275                    {
    6081                         kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->pwcBuf, pLineBuf->cwcBuf, K_TRUE /*fBrokenLine*/);
    6082                         pLineBuf->cwcBuf = 0;
     6276                        kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->u.Con.pwcBuf, pLineBuf->u.Con.cwcBuf,
     6277                                                      K_TRUE /*fBrokenLine*/);
     6278                        pLineBuf->u.Con.cwcBuf = 0;
    60836279                    }
    60846280                    if (off < offNextLine)
     
    61056301        if (offLastIncompleteLine < cwcToWrite)
    61066302        {
    6107             memcpy(&pLineBuf->pwcBuf[0], &pwcBuffer[offLastIncompleteLine], cchLastIncompleteLine * sizeof(wchar_t));
    6108             pLineBuf->cwcBuf = cchLastIncompleteLine;
     6303            memcpy(&pLineBuf->u.Con.pwcBuf[0], &pwcBuffer[offLastIncompleteLine], cchLastIncompleteLine * sizeof(wchar_t));
     6304            pLineBuf->u.Con.cwcBuf = cchLastIncompleteLine;
    61096305        }
    61106306    }
     
    61296325    wchar_t    *pwcBufFree = NULL;
    61306326    wchar_t    *pwcBuf;
     6327    kHlpAssert(pLineBuf->fIsConsole);
    61316328
    61326329    if (cwcBuf <= 4096)
     
    61446341
    61456342        /* Flush the line buffer and combined buffer before calling WriteConsoleA. */
    6146         if (pLineBuf->cwcBuf > 0)
    6147         {
    6148             kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->pwcBuf, pLineBuf->cwcBuf, K_TRUE /*fBroken*/);
    6149             pLineBuf->cwcBuf = 0;
     6343        if (pLineBuf->u.Con.cwcBuf > 0)
     6344        {
     6345            kwSandboxConsoleAddToCombined(pSandbox, pLineBuf->u.Con.pwcBuf, pLineBuf->u.Con.cwcBuf, K_TRUE /*fBroken*/);
     6346            pLineBuf->u.Con.cwcBuf = 0;
    61506347        }
    61516348        kwSandboxConsoleFlushCombined(pSandbox);
     
    62156412    if (hConOutput == g_Sandbox.StdErr.hOutput)
    62166413        pLineBuf = &g_Sandbox.StdErr;
     6414    else if (hConOutput == g_Sandbox.StdOut.hOutput)
     6415        pLineBuf = &g_Sandbox.StdOut;
    62176416    else
    6218         pLineBuf = &g_Sandbox.StdOut;
     6417        pLineBuf = g_Sandbox.StdErr.fIsConsole ? &g_Sandbox.StdErr : &g_Sandbox.StdOut;
    62196418    if (pLineBuf->fIsConsole)
    62206419    {
     
    73777576    pSandbox->wpgmptr       = (wchar_t *)pTool->pwszPath;
    73787577#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    7379     pSandbox->StdOut.cwcBuf = 0;
    7380     pSandbox->StdErr.cwcBuf = 0;
     7578    if (pSandbox->StdOut.fIsConsole)
     7579        pSandbox->StdOut.u.Con.cwcBuf = 0;
     7580    else
     7581        pSandbox->StdOut.u.Fully.cchBuf = 0;
     7582    if (pSandbox->StdErr.fIsConsole)
     7583        pSandbox->StdErr.u.Con.cwcBuf = 0;
     7584    else
     7585        pSandbox->StdErr.u.Fully.cchBuf = 0;
    73817586    pSandbox->Combined.cwcBuf = 0;
    73827587    pSandbox->Combined.cFlushes = 0;
     
    82108415        }
    82118416
     8417        /* Trigger breakpoint */
     8418        if (   i < argc
     8419            && strcmp(argv[i], "--breakpoint") == 0)
     8420        {
     8421            __debugbreak();
     8422            i++;
     8423        }
     8424
    82128425        /* Check for '--'. */
    82138426        if (i >= argc)
     
    83638576                   "usage: kWorker <--help|-h>\n"
    83648577                   "usage: kWorker <--version|-V>\n"
    8365                    "usage: kWorker [--volatile dir] --test [<times> [--chdir <dir>]] -- args\n"
     8578                   "usage: kWorker [--volatile dir] --test [<times> [--chdir <dir>] [--breakpoint] -- args\n"
    83668579                   "\n"
    83678580                   "This is an internal kmk program that is used via the builtin_kSubmit.\n");
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