Changeset 2900 for trunk/src/kmk


Ignore:
Timestamp:
Sep 9, 2016, 4:42:06 PM (9 years ago)
Author:
bird
Message:

output optimizations

Location:
trunk/src/kmk
Files:
3 edited

Legend:

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

    r2113 r2900  
    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
     87extern ssize_t maybe_con_write(int, void const *, size_t);
     88#endif
     89
     90
    8391int bflag, eflag, nflag, sflag, tflag, vflag;
    8492/*int rval;*/
     
    120128#ifdef kmk_builtin_cat /* kmk did this already. */
    121129        setlocale(LC_CTYPE, "");
     130#else
     131        fflush(stdout);
    122132#endif
    123133
     
    288298raw_cat(int rfd)
    289299{
    290         int off, wfd;
     300        int off, wfd = fileno(stdout);
    291301        ssize_t nr, nw;
    292302        static size_t bsize;
     
    298308                if (fstat(wfd, &sbuf))
    299309                        return err(1, "%s", filename);
    300 #ifdef _MSC_VER
    301                 bsize = 1024;
     310#ifdef KBUILD_OS_WINDOWS
     311                bsize = 16384;
    302312#else
    303313                bsize = MAX(sbuf.st_blksize, 1024);
  • trunk/src/kmk/kmkbuiltin/printf.c

    r2646 r2900  
    7676#include "../kmkbuiltin.h"
    7777
     78#ifdef KBUILD_OS_WINDOWS
     79/* This is a trick to speed up console output on windows. */
     80# undef fwrite
     81# define fwrite maybe_con_fwrite
     82extern size_t maybe_con_fwrite(void const *, size_t, size_t, FILE *);
     83#endif
     84
    7885
    7986#ifdef __GNUC__
     
    113120static int       usage(FILE *);
    114121
     122static int      flush_buffer(void);
    115123static void     b_count(int);
    116124static void     b_output(int);
     
    126134#include "../../bin/sh/bltin/bltin.h"
    127135#endif /* SHELL */
     136
     137/* Buffer the output because windows doesn't do line buffering of stdout. */
     138static char     g_achBuf[256];
     139static size_t   g_cchBuf;
    128140
    129141#define PF(f, func) { \
     
    156168        int ch;
    157169
    158         /* kmk: reset getopt and set progname */
     170        /* kmk: reset getopt, set progname and reset buffer. */
    159171        g_progname = argv[0];
    160172        opterr = 1;
     
    225237        rval = 0;
    226238        gargv = NULL;
     239        g_cchBuf = 0;
    227240
    228241        format = *argv;
     
    272285                        ch = *fmt;
    273286                        if (!ch) {
     287                                flush_buffer();
    274288                                warnx("missing format character");
    275289                                return (1);
     
    354368                        }
    355369                        default:
     370                                flush_buffer();
    356371                                warnx("%s: invalid directive", start);
    357372                                return 1;
     
    360375                        *fmt = nextch;
    361376                        /* escape if a \c was encountered */
    362                         if (rval & 0x100)
     377                        if (rval & 0x100) {
     378                                flush_buffer();
    363379                                return rval & ~0x100;
     380                        }
    364381                }
    365382        } while (gargv != argv && *gargv);
    366383
     384        flush_buffer();
    367385        return rval;
    368386}
     387
    369388
    370389/* helper functions for conv_escape_str */
     
    408427        }
    409428#endif
    410         return putchar(ch);
     429        /* Buffered output. */
     430        if (g_cchBuf + 1 < sizeof(g_achBuf)) {
     431                g_achBuf[g_cchBuf++] = ch;
     432        } else {
     433                int rc = flush_buffer();
     434                g_achBuf[g_cchBuf++] = ch;
     435                if (rc)
     436                        return -1;
     437        }
     438        return 0;
    411439}
    412440
    413441static int wrap_printf(const char * fmt, ...)
    414442{
    415         int rc;
     443        ssize_t cchRet;
    416444        va_list va;
    417 
     445        char *pszTmp;
     446
     447        va_start(va, fmt);
     448        cchRet = vasprintf(&pszTmp, fmt, va);
     449        va_end(va);
     450        if (cchRet >= 0) {
    418451#ifndef kmk_builtin_printf
    419         if (g_o) {
    420                 char *str;
    421 
    422                 va_start(va, fmt);
    423                 rc = vasprintf(&str, fmt, va);
    424                 va_end(va);
    425                 if (rc >= 0) {
    426                         g_o = variable_buffer_output(g_o, str, rc);
    427                         free(str);
    428                 }
    429                 return rc;
    430         }
    431 #endif
    432 
    433         va_start(va, fmt);
    434         rc = vprintf(fmt, va);
    435         va_end(va);
    436         return rc;
    437 }
     452                if (g_o) {
     453                        g_o = variable_buffer_output(g_o, pszTmp, cchRet);
     454                } else
     455#endif
     456                {
     457                        if (cchRet + g_cchBuf <= sizeof(g_achBuf)) {
     458                                /* We've got space in the buffer. */
     459                                memcpy(&g_achBuf[g_cchBuf], pszTmp, cchRet);
     460                                g_cchBuf += cchRet;
     461                        } else {
     462                                /* Try write out complete lines. */
     463                                const char *pszLeft = pszTmp;
     464                                ssize_t     cchLeft = cchRet;
     465
     466                                while (cchLeft > 0) {
     467                                        const char *pchNewLine = strchr(pszLeft, '\n');
     468                                        ssize_t     cchLine    = pchNewLine ? pchNewLine - pszLeft + 1 : cchLeft;
     469                                        if (g_cchBuf + cchLine <= sizeof(g_achBuf)) {
     470                                                memcpy(&g_achBuf[g_cchBuf], pszLeft, cchLine);
     471                                                g_cchBuf += cchLine;
     472                                        } else {
     473                                                if (flush_buffer() < 0) {
     474                                                        return -1;
     475                                                }
     476                                                if (fwrite(pszLeft, cchLine, 1, stdout) < 1) {
     477                                                        return -1;
     478                                                }
     479                                        }
     480                                        pszLeft += cchLine;
     481                                        cchLeft -= cchLine;
     482                                }
     483                        }
     484                }
     485                free(pszTmp);
     486        }
     487        return (int)cchRet;
     488}
     489
     490/**
     491 * Flushes the g_abBuf/g_cchBuf.
     492 */
     493static int flush_buffer(void)
     494{
     495    if (g_cchBuf > 0) {
     496                ssize_t cchToWrite = g_cchBuf;
     497                ssize_t cchWritten = fwrite(g_achBuf, 1, g_cchBuf, stdout);
     498                g_cchBuf = 0;
     499                if (cchWritten >= cchToWrite) {
     500                        /* likely */
     501                } else {
     502                        ssize_t off = cchWritten;
     503                        if (cchWritten >= 0) {
     504                                off = cchWritten;
     505                        } else if (errno == EINTR) {
     506                                cchWritten = 0;
     507                        } else {
     508                                return -1;
     509                        }
     510
     511                        while (off < cchToWrite) {
     512                                cchWritten = fwrite(&g_achBuf[off], 1, cchToWrite - off, stdout);
     513                                if (cchWritten > 0) {
     514                                        off += cchWritten;
     515                                } else if (errno == EINTR) {
     516                                        /* nothing */
     517                                } else {
     518                                        return -1;
     519                                }
     520                        }
     521                }
     522    }
     523    return 0;
     524}
     525
    438526
    439527
  • trunk/src/kmk/main.c

    r2818 r2900  
    13801380  char *windows32_path = NULL;
    13811381
    1382 #ifndef ELECTRIC_HEAP /* Drop this because it prevents JIT debugging. */
     1382# ifndef ELECTRIC_HEAP /* Drop this because it prevents JIT debugging. */
    13831383  SetUnhandledExceptionFilter(handle_runtime_exceptions);
    1384 #endif /* !ELECTRIC_HEAP */
     1384# endif /* !ELECTRIC_HEAP */
    13851385
    13861386  /* start off assuming we have no shell */
Note: See TracChangeset for help on using the changeset viewer.