Ignore:
Timestamp:
Mar 24, 2018, 4:32:26 PM (7 years ago)
Author:
bird
Message:

kmk,lib,kWorker: Console output on windows cleanups.

File:
1 edited

Legend:

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

    r3140 r3188  
    4545#undef lutimes
    4646
    47 extern ssize_t maybe_con_write(int, void const *, size_t);
     47#include "console.h"
     48
    4849
    4950
     
    477478    {
    478479        /* Console output optimization: */
    479         if (cbSrc > 0 && isatty(fd))
     480        if (cbSrc > 0 && is_console(fd))
    480481            return maybe_con_write(fd, pvSrc, cbSrc);
    481482
     
    586587ssize_t writev(int fd, const struct iovec *vector, int count)
    587588{
    588     int size = 0;
    589     int i;
    590     for (i = 0; i < count; i++)
    591     {
    592         int cb = msc_write(fd, vector[i].iov_base, (int)vector[i].iov_len);
    593         if (cb < 0)
    594             return cb;
    595         size += cb;
     589    ssize_t size = 0;
     590    if (count > 0)
     591    {
     592        int i;
     593
     594        /* To get consistent console output, we must try combine the segments
     595           when outputing to the console. */
     596        if (count > 1 && is_console(fd))
     597        {
     598            char   *pbTmp;
     599            ssize_t cbTotal;
     600            if (count == 1)
     601                return maybe_con_write(fd, vector[0].iov_base, (int)vector[0].iov_len);
     602
     603            cbTotal = 0;
     604            for (i = 0; i < count; i++)
     605                cbTotal += vector[i].iov_len;
     606            pbTmp = malloc(cbTotal);
     607            if (pbTmp)
     608            {
     609                char *pbCur = pbTmp;
     610                for (i = 0; i < count; i++)
     611                {
     612                    memcpy(pbCur, vector[i].iov_base, vector[i].iov_len);
     613                    pbCur += vector[i].iov_len;
     614                }
     615                size = maybe_con_write(fd, pbTmp, cbTotal);
     616                free(pbTmp);
     617                return size;
     618            }
     619
     620            /* fall back on segment by segment output. */
     621        }
     622
     623        for (i = 0; i < count; i++)
     624        {
     625            int cb = msc_write(fd, vector[i].iov_base, (int)vector[i].iov_len);
     626            if (cb < 0)
     627                return cb;
     628            size += cb;
     629        }
    596630    }
    597631    return size;
Note: See TracChangeset for help on using the changeset viewer.