VirtualBox

Changeset 3117 in kBuild for trunk/src


Ignore:
Timestamp:
Oct 30, 2017 5:49:42 PM (8 years ago)
Author:
bird
Message:

mscfakes.c,cat.c: msc_write: Do the console optimizations. Make the ENOSPC workaround more reliable (looks like _write may actually return a count that is higher than the input, or something else to that effect is going tits up). Fixed a bug if we ever should write more than 1GB in one go, it would've spun forever.

Location:
trunk/src/kmk/kmkbuiltin
Files:
2 edited

Legend:

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

    r2900 r3117  
    8181
    8282
    83 #ifdef KBUILD_OS_WINDOWS
    84 /* This is a trick to seriuosly speed up console output windows. */
    85 # undef write
    86 # define write maybe_con_write
    87 extern ssize_t maybe_con_write(int, void const *, size_t);
    88 #endif
    89 
    90 
    9183int bflag, eflag, nflag, sflag, tflag, vflag;
    9284/*int rval;*/
  • trunk/src/kmk/kmkbuiltin/mscfakes.c

    r3094 r3117  
    4848#include <Windows.h>
    4949#undef timeval
     50
     51extern ssize_t maybe_con_write(int, void const *, size_t);
    5052
    5153
     
    474476ssize_t msc_write(int fd, const void *pvSrc, size_t cbSrc)
    475477{
     478#define MSC_WRITE_MAX_CHUNK (UINT_MAX / 32)
    476479    ssize_t cbRet;
    477     if (cbSrc < UINT_MAX / 4)
    478     {
     480    if (cbSrc <= MSC_WRITE_MAX_CHUNK)
     481    {
     482        /* Console output optimization: */
     483        if (cbSrc > 0 && isatty(fd))
     484            return maybe_con_write(fd, pvSrc, cbSrc);
     485
    479486#ifndef MSC_WRITE_TEST
    480487        cbRet = _write(fd, pvSrc, (unsigned int)cbSrc);
     
    485492        {
    486493            /* ENOSPC on pipe kludge. */
    487             int cbLimit;
     494            unsigned int cbLimit;
    488495            int cSinceLastSuccess;
    489496
     
    502509            /* Likely a full pipe buffer, try write smaller amounts and do some
    503510               sleeping inbetween each unsuccessful one. */
    504             cbLimit = cbSrc / 4;
     511            cbLimit = (unsigned)(cbSrc / 4);
    505512            if (cbLimit < 4)
    506513                cbLimit = 4;
     
    513520#endif
    514521
    515             while (cbSrc > 0)
     522            while ((ssize_t)cbSrc > 0)
    516523            {
    517                 unsigned int cbAttempt = cbSrc > cbLimit ? (int)cbLimit : (int)cbSrc;
     524                unsigned int cbAttempt = cbSrc > cbLimit ? cbLimit : (unsigned int)cbSrc;
    518525                ssize_t cbActual = _write(fd, pvSrc, cbAttempt);
    519526                if (cbActual > 0)
    520527                {
    521                     assert(cbActual <= (ssize_t)cbAttempt);
     528                    /* For some reason, it seems like we cannot trust _write to return
     529                       a number that's less or equal to the number of bytes we passed
     530                       in to the call.  (Also reason for signed check in loop.) */
     531                    if (cbActual > cbAttempt)
     532                        cbActual = cbAttempt;
     533
    522534                    pvSrc  = (char *)pvSrc + cbActual;
    523535                    cbSrc -= cbActual;
     
    559571        while (cbSrc > 0)
    560572        {
    561             size_t  cbToWrite = cbSrc > UINT_MAX / 4 ? UINT_MAX / 4 : cbSrc;
     573            size_t  cbToWrite = cbSrc > MSC_WRITE_MAX_CHUNK ? MSC_WRITE_MAX_CHUNK : cbSrc;
    562574            ssize_t cbWritten = msc_write(fd, pvSrc, cbToWrite);
    563575            if (cbWritten > 0)
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